ASP.NET Core SignalR yapılandırması

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirme, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir. AddJsonProtocol içinde sonra AddSignalRStartup.ConfigureServiceseklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerOptions nesnedeki özelliği, bağımsız değişkenlerin serileştirmesini ve dönüş değerlerini yapılandırmak için kullanılabilecek bir System.Text.JsonJsonSerializerOptions nesnedir. Daha fazla bilgi için System.Text.Json belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine özellik adlarının büyük/küçük harflerini değiştirmeyecek şekilde yapılandırmak için içinde Program.csaşağıdaki kodu kullanın:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

Newtonsoft.Json'a geçiş yapma

içinde desteklenmeyen Newtonsoft.Json özelliklerine ihtiyacınız varsa bkz. geçiş yapmaNewtonsoft.Json.System.Text.Json

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ClientTimeoutInterval 30 saniye Sunucu, bu aralıkta bir ileti (canlı tutma dahil) almadıysa istemcinin bağlantısının kesilmiş olduğunu düşünür. Bunun uygulanması nedeniyle istemcinin bağlantısı kesildi olarak işaretlenmesi bu zaman aşımı aralığından daha uzun sürebilir. Önerilen değer, değerin iki katıdır KeepAliveInterval .
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .
StreamBufferCapacity 10 İstemci karşıya yükleme akışları için arabelleğe alınabilecek en fazla öğe sayısı. Bu sınıra ulaşılırsa, sunucu akış öğelerini işleyene kadar çağrıların işlenmesi engellenir.
MaximumReceiveMessageSize 32 KB Tek bir gelen hub iletisinin boyutu üst sınırı. Değerin artırılması Hizmet reddi (DoS) saldırıları riskini artırabilir.
MaximumParallelInvocationsPerClient 1 Her istemcinin kuyruğa almadan önce paralel olarak çağırabileceği en fazla hub yöntemi sayısı.
DisableImplicitFromServicesParameters false Hub yöntemi bağımsız değişkenleri mümkünse DI'den çözümlenir.

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Program.csiçin yapılandırılabilir.

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubProgram.csgeçirilerek yapılandırılır.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 64 KB İstemciden alınan ve sunucunun geri baskı uygulamadan önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, sunucunun geri baskı uygulamadan daha büyük iletileri daha hızlı almasını sağlar, ancak bellek tüketimini artırabilir.
TransportMaxBufferSize 64 KB Uygulamanın geri baskıyı gözlemlemeden önce arabelleğe aldığı en fazla bayt sayısı. Bu değerin artırılması, sunucunun geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.
MinimumProtocolVersion 0 Anlaşma protokolünün en düşük sürümünü belirtin. Bu, istemcileri daha yeni sürümlere sınırlamak için kullanılır.
CloseOnAuthenticationExpiration false Bir belirtecin süresi dolduğunda bağlantıları kapatacak kimlik doğrulaması süre sonu izlemeyi etkinleştirmek için bu seçeneği ayarlayın.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel Bir değer yerine, günlük düzeyi adını temsil eden bir string değer de sağlayabilirsiniz. Sabitlere erişiminiz olmayan ortamlarda günlüğe kaydetmeyi LogLevel yapılandırırken SignalR bu yararlı olur.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

Aşağıdaki tablo kullanılabilir günlük düzeylerini listeler. Sağlamak için sağladığınız değer, günlüğe configureLoggingkaydedilecek en düşük günlük düzeyini ayarlar. Bu düzeyde günlüğe kaydedilen iletiler veya tabloda ondan sonra listelenen düzeyler günlüğe kaydedilir.

String GünlükDüzeyi
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Java istemcisi websockets'in bu sürümünde tek kullanılabilir aktarımdır.

Java istemcisinde aktarım, üzerindeki HttpHubConnectionBuilderyöntemiyle withTransport seçilir. Java istemcisi varsayılan olarak WebSockets aktarımını kullanır.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Dekont

SignalR Java istemcisi henüz aktarım geri dönüşünü desteklemez.

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Zaman aşımı ve canlı tutma davranışını yapılandırmak için ek seçenekler:

Seçenek Varsayılan değer Tanım
WithServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı ve doğrudan üzerinde HubConnectionBuilderayarlanır. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, ping'lerin ulaşmasına izin vermek için sunucunun etkin tutma aralığı (WithKeepAliveInterval) değerinin en az iki katı bir sayıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı ve nesnenin HubConnection kendisinde kullanılabilir. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
WithKeepAliveInterval 15 saniye İstemcinin ping iletileri gönderdiği aralığı belirler ve doğrudan üzerinde HubConnectionBuilderayarlanır. Bu ayar, sunucunun bir istemcinin bilgisayarını ağdan çıkarması gibi sabit bağlantı kesilmelerini algılamasına olanak tanır. İstemciden herhangi bir ileti göndererek zamanlayıcıyı aralığın başlangıcına sıfırlar. İstemci sunucudaki kümede ClientTimeoutInterval bir ileti göndermediyse, sunucu istemcinin bağlantısının kesileceğini düşünür.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Aşağıdaki örnekte, varsayılan değerlerin iki katı olan değerler gösterilmektedir:

var builder = new HubConnectionBuilder()
    .WithUrl(Navigation.ToAbsoluteUri("/chathub"))
    .WithServerTimeout(TimeSpan.FromSeconds(60))
    .WithKeepAliveInterval(TimeSpan.FromSeconds(30))
    .Build();

builder.On<string, string>("ReceiveMessage", (user, message) => ...

await builder.StartAsync();

Durum bilgisi olan yeniden bağlanmayı yapılandırma

SignalR durum bilgisi olan yeniden bağlantı, ağ bağlantıları arasında geçiş yapma veya erişimde kısa bir geçici kayıp gibi ağ bağlantılarında geçici bağlantı kesilen istemcilerin algılanan kapalı kalma süresini azaltır.

Durum bilgisi olan yeniden bağlantı bunu şu şekilde elde eder:

  • Sunucu ve istemcideki veriler geçici olarak arabelleğe alınıyor.
  • Hem sunucu hem de istemci tarafından alınan iletileri (ACK-ing) kabul etme.
  • Bağlantının ne zaman çalışır durumda olduğunu tanıma ve bağlantı devre dışıyken gönderilmiş olabilecek iletileri yeniden yürütme.

Durum bilgisi olan yeniden bağlantı, ASP.NET Core 8.0 ve sonraki sürümlerde kullanılabilir.

Hem sunucu hub'ı uç noktasında hem de istemcide durum bilgisi olan yeniden bağlanmayı kabul edin:

  • Şu seçeneği etkinleştirmek için sunucu hub'ı uç noktası yapılandırmasını güncelleştirin AllowStatefulReconnects :

    app.MapHub<MyHub>("/hubName", options =>
    {
        options.AllowStatefulReconnects = true;
    });
    

    İsteğe bağlı olarak, sunucunun izin verdiği bayt cinsinden maksimum arabellek boyutu genel olarak veya belirli bir hub için şu seçenekle StatefulReconnectBufferSize ayarlanabilir:

    Genel StatefulReconnectBufferSize olarak ayarlanan seçenek:

    builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
    

    StatefulReconnectBufferSize Belirli bir hub için ayarlanan seçenek:

    builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
    

    Seçenek StatefulReconnectBufferSize , varsayılan olarak 100.000 bayt olan isteğe bağlıdır.

  • Seçeneği etkinleştirmek için JavaScript veya TypeScript istemci kodunu güncelleştirin withStatefulReconnect :

    const builder = new signalR.HubConnectionBuilder()
      .withUrl("/hubname")
      .withStatefulReconnect({ bufferSize: 1000 });  // Optional, defaults to 100,000
    const connection = builder.build();
    

    Seçenek bufferSize , varsayılan olarak 100.000 bayt olan isteğe bağlıdır.

  • Seçeneği etkinleştirmek için .NET istemci kodunu güncelleştirin WithStatefulReconnect :

      var builder = new HubConnectionBuilder()
          .WithUrl("<hub url>")
          .WithStatefulReconnect();
      builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000);
      var hubConnection = builder.Build();
    

    Seçenek StatefulReconnectBufferSize , varsayılan olarak 100.000 bayt olan isteğe bağlıdır.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.
ApplicationMaxBufferSize 1 MB İstemcinin geri baskı uygulamadan önce sunucudan aldığı maksimum bayt sayısı. Bu değerin artırılması, istemcinin geri baskı uygulamadan daha büyük iletileri daha hızlı almasını sağlar, ancak bellek tüketimini artırabilir.
TransportMaxBufferSize 1 MB kullanıcı uygulaması tarafından gönderilen ve istemcinin geri baskıyı gözlemlemeden önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, istemcinin geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirmesi, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir ve bu yöntem yönteminizden Startup.ConfigureServices sonra AddSignalR eklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerSettings nesnedeki özelliği, bağımsız değişkenlerin serileştirilmesini yapılandırmak ve değerleri döndürmek için kullanılabilecek bir Json.NET JsonSerializerSettings nesnesidir. Daha fazla bilgi için Json.NET belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine "PascalCase" özellik adlarını kullanacak şekilde yapılandırmak için içinde Startup.ConfigureServicesaşağıdaki kodu kullanın:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Startup.ConfigureServicesiçin yapılandırılabilir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubStartup.Configuregeçirilerek yapılandırılır.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 32 KB Sunucunun arabelleğe aldığı istemciden alınan bayt sayısı üst sınırı. Bu değerin artırılması sunucunun daha büyük iletiler almasına olanak tanır, ancak bellek tüketimini olumsuz etkileyebilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
TransportMaxBufferSize 32 KB Sunucunun arabelleğe aldığı uygulama tarafından gönderilen bayt sayısı üst sınırı. Bu değerin artırılması sunucunun daha büyük iletiler göndermesine olanak tanır, ancak bellek tüketimini olumsuz etkileyebilir.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Nesnenin kendisinde zaman aşımı ve canlı tutma davranışını yapılandırmaya HubConnection yönelik ek seçenekler vardır:

Seçenek Varsayılan değer Tanım
ServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, pinglerin gelmesi için zaman tanıyacak şekilde sunucunun KeepAliveInterval değerinin en az iki katıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirmesi, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir ve bu yöntem yönteminizden Startup.ConfigureServices sonra AddSignalR eklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerSettings nesnedeki özelliği, bağımsız değişkenlerin serileştirilmesini yapılandırmak ve değerleri döndürmek için kullanılabilecek bir Json.NET JsonSerializerSettings nesnesidir. Daha fazla bilgi için Json.NET belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine "PascalCase" özellik adlarını kullanacak şekilde yapılandırmak için içinde Startup.ConfigureServicesaşağıdaki kodu kullanın:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ClientTimeoutInterval 30 saniye Sunucu, bu aralıkta bir ileti (canlı tutma dahil) almadıysa istemcinin bağlantısının kesilmiş olduğunu düşünür. Bunun uygulanması nedeniyle istemcinin bağlantısı kesildi olarak işaretlenmesi bu zaman aşımı aralığından daha uzun sürebilir. Önerilen değer, değerin iki katıdır KeepAliveInterval .
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Startup.ConfigureServicesiçin yapılandırılabilir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubStartup.Configuregeçirilerek yapılandırılır.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 32 KB Sunucunun arabelleğe aldığı istemciden alınan bayt sayısı üst sınırı. Bu değerin artırılması sunucunun daha büyük iletiler almasına olanak tanır, ancak bellek tüketimini olumsuz etkileyebilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
TransportMaxBufferSize 32 KB Sunucunun arabelleğe aldığı uygulama tarafından gönderilen bayt sayısı üst sınırı. Bu değerin artırılması sunucunun daha büyük iletiler göndermesine olanak tanır, ancak bellek tüketimini olumsuz etkileyebilir.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Java istemcisi websockets'in bu sürümünde tek kullanılabilir aktarımdır.

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Nesnenin kendisinde zaman aşımı ve canlı tutma davranışını yapılandırmaya HubConnection yönelik ek seçenekler vardır:

Seçenek Varsayılan değer Tanım
ServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, pinglerin gelmesi için zaman tanıyacak şekilde sunucunun KeepAliveInterval değerinin en az iki katıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye İstemcinin ping iletileri gönderdiği aralığı belirler. İstemciden herhangi bir ileti göndererek zamanlayıcıyı aralığın başlangıcına sıfırlar. İstemci sunucudaki kümede ClientTimeoutInterval bir ileti göndermediyse, sunucu istemcinin bağlantısının kesileceğini düşünür.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirme, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir. AddJsonProtocol içinde sonra AddSignalRStartup.ConfigureServiceseklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerOptions nesnedeki özelliği, bağımsız değişkenlerin serileştirmesini ve dönüş değerlerini yapılandırmak için kullanılabilecek bir System.Text.JsonJsonSerializerOptions nesnedir. Daha fazla bilgi için System.Text.Json belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine özellik adlarının büyük/küçük harflerini değiştirmeyecek şekilde yapılandırmak için içinde Startup.ConfigureServicesaşağıdaki kodu kullanın:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

Newtonsoft.Json'a geçiş yapma

içinde desteklenmeyen Newtonsoft.Json özelliklerine ihtiyacınız varsa bkz. geçiş yapmaNewtonsoft.Json.System.Text.Json

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ClientTimeoutInterval 30 saniye Sunucu, bu aralıkta bir ileti (canlı tutma dahil) almadıysa istemcinin bağlantısının kesilmiş olduğunu düşünür. Bunun uygulanması nedeniyle istemcinin bağlantısı kesildi olarak işaretlenmesi bu zaman aşımı aralığından daha uzun sürebilir. Önerilen değer, değerin iki katıdır KeepAliveInterval .
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .
StreamBufferCapacity 10 İstemci karşıya yükleme akışları için arabelleğe alınabilecek en fazla öğe sayısı. Bu sınıra ulaşılırsa, sunucu akış öğelerini işleyene kadar çağrıların işlenmesi engellenir.
MaximumReceiveMessageSize 32 KB Tek bir gelen hub iletisinin boyutu üst sınırı. Değerin artırılması Hizmet reddi (DoS) saldırıları riskini artırabilir.

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Startup.ConfigureServicesiçin yapılandırılabilir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubStartup.Configuregeçirilerek yapılandırılır.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 32 KB İstemciden alınan ve sunucunun geri baskı uygulamadan önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, sunucunun geri baskı uygulamadan daha hızlı bir şekilde daha büyük iletiler almasına olanak tanır, ancak bellek tüketimini artırabilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
TransportMaxBufferSize 32 KB Uygulamanın geri baskıyı gözlemlemeden önce arabelleğe aldığı en fazla bayt sayısı. Bu değerin artırılması, sunucunun geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel Bir değer yerine, günlük düzeyi adını temsil eden bir string değer de sağlayabilirsiniz. Sabitlere erişiminiz olmayan ortamlarda günlüğe kaydetmeyi LogLevel yapılandırırken SignalR bu yararlı olur.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

Aşağıdaki tablo kullanılabilir günlük düzeylerini listeler. Sağlamak için sağladığınız değer, günlüğe configureLoggingkaydedilecek en düşük günlük düzeyini ayarlar. Bu düzeyde günlüğe kaydedilen iletiler veya tabloda ondan sonra listelenen düzeyler günlüğe kaydedilir.

String GünlükDüzeyi
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Java istemcisi websockets'in bu sürümünde tek kullanılabilir aktarımdır.

Java istemcisinde aktarım, üzerindeki HttpHubConnectionBuilderyöntemiyle withTransport seçilir. Java istemcisi varsayılan olarak WebSockets aktarımını kullanır.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Dekont

SignalR Java istemcisi henüz aktarım geri dönüşünü desteklemez.

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Nesnenin kendisinde zaman aşımı ve canlı tutma davranışını yapılandırmaya HubConnection yönelik ek seçenekler vardır:

Seçenek Varsayılan değer Tanım
ServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, pinglerin gelmesi için zaman tanıyacak şekilde sunucunun KeepAliveInterval değerinin en az iki katıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye İstemcinin ping iletileri gönderdiği aralığı belirler. İstemciden herhangi bir ileti göndererek zamanlayıcıyı aralığın başlangıcına sıfırlar. İstemci sunucudaki kümede ClientTimeoutInterval bir ileti göndermediyse, sunucu istemcinin bağlantısının kesileceğini düşünür.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirme, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir. AddJsonProtocol içinde sonra AddSignalRStartup.ConfigureServiceseklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerOptions nesnedeki özelliği, bağımsız değişkenlerin serileştirmesini ve dönüş değerlerini yapılandırmak için kullanılabilecek bir System.Text.JsonJsonSerializerOptions nesnedir. Daha fazla bilgi için System.Text.Json belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine özellik adlarının büyük/küçük harflerini değiştirmeyecek şekilde yapılandırmak için içinde Startup.ConfigureServicesaşağıdaki kodu kullanın:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

Newtonsoft.Json'a geçiş yapma

içinde desteklenmeyen Newtonsoft.Json özelliklerine ihtiyacınız varsa bkz. geçiş yapmaNewtonsoft.Json.System.Text.Json

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ClientTimeoutInterval 30 saniye Sunucu, bu aralıkta bir ileti (canlı tutma dahil) almadıysa istemcinin bağlantısının kesilmiş olduğunu düşünür. Bunun uygulanması nedeniyle istemcinin bağlantısı kesildi olarak işaretlenmesi bu zaman aşımı aralığından daha uzun sürebilir. Önerilen değer, değerin iki katıdır KeepAliveInterval .
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .
StreamBufferCapacity 10 İstemci karşıya yükleme akışları için arabelleğe alınabilecek en fazla öğe sayısı. Bu sınıra ulaşılırsa, sunucu akış öğelerini işleyene kadar çağrıların işlenmesi engellenir.
MaximumReceiveMessageSize 32 KB Tek bir gelen hub iletisinin boyutu üst sınırı. Değerin artırılması Hizmet reddi (DoS) saldırıları riskini artırabilir.

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Startup.ConfigureServicesiçin yapılandırılabilir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubStartup.Configuregeçirilerek yapılandırılır.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 32 KB İstemciden alınan ve sunucunun geri baskı uygulamadan önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, sunucunun geri baskı uygulamadan daha hızlı bir şekilde daha büyük iletiler almasına olanak tanır, ancak bellek tüketimini artırabilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
TransportMaxBufferSize 32 KB Uygulamanın geri baskıyı gözlemlemeden önce arabelleğe aldığı en fazla bayt sayısı. Bu değerin artırılması, sunucunun geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.
MinimumProtocolVersion 0 Anlaşma protokolünün en düşük sürümünü belirtin. Bu, istemcileri daha yeni sürümlere sınırlamak için kullanılır.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel Bir değer yerine, günlük düzeyi adını temsil eden bir string değer de sağlayabilirsiniz. Sabitlere erişiminiz olmayan ortamlarda günlüğe kaydetmeyi LogLevel yapılandırırken SignalR bu yararlı olur.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

Aşağıdaki tablo kullanılabilir günlük düzeylerini listeler. Sağlamak için sağladığınız değer, günlüğe configureLoggingkaydedilecek en düşük günlük düzeyini ayarlar. Bu düzeyde günlüğe kaydedilen iletiler veya tabloda ondan sonra listelenen düzeyler günlüğe kaydedilir.

String GünlükDüzeyi
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Java istemcisi websockets'in bu sürümünde tek kullanılabilir aktarımdır.

Java istemcisinde aktarım, üzerindeki HttpHubConnectionBuilderyöntemiyle withTransport seçilir. Java istemcisi varsayılan olarak WebSockets aktarımını kullanır.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Dekont

SignalR Java istemcisi henüz aktarım geri dönüşünü desteklemez.

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Nesnenin kendisinde zaman aşımı ve canlı tutma davranışını yapılandırmaya HubConnection yönelik ek seçenekler vardır:

Seçenek Varsayılan değer Tanım
ServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, pinglerin gelmesi için zaman tanıyacak şekilde sunucunun KeepAliveInterval değerinin en az iki katıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye İstemcinin ping iletileri gönderdiği aralığı belirler. İstemciden herhangi bir ileti göndererek zamanlayıcıyı aralığın başlangıcına sıfırlar. İstemci sunucudaki kümede ClientTimeoutInterval bir ileti göndermediyse, sunucu istemcinin bağlantısının kesileceğini düşünür.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirme, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir. AddJsonProtocol içinde sonra AddSignalRStartup.ConfigureServiceseklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerOptions nesnedeki özelliği, bağımsız değişkenlerin serileştirmesini ve dönüş değerlerini yapılandırmak için kullanılabilecek bir System.Text.JsonJsonSerializerOptions nesnedir. Daha fazla bilgi için System.Text.Json belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine özellik adlarının büyük/küçük harflerini değiştirmeyecek şekilde yapılandırmak için içinde Startup.ConfigureServicesaşağıdaki kodu kullanın:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

Newtonsoft.Json'a geçiş yapma

içinde desteklenmeyen Newtonsoft.Json özelliklerine ihtiyacınız varsa bkz. geçiş yapmaNewtonsoft.Json.System.Text.Json

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ClientTimeoutInterval 30 saniye Sunucu, bu aralıkta bir ileti (canlı tutma dahil) almadıysa istemcinin bağlantısının kesilmiş olduğunu düşünür. Bunun uygulanması nedeniyle istemcinin bağlantısı kesildi olarak işaretlenmesi bu zaman aşımı aralığından daha uzun sürebilir. Önerilen değer, değerin iki katıdır KeepAliveInterval .
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .
StreamBufferCapacity 10 İstemci karşıya yükleme akışları için arabelleğe alınabilecek en fazla öğe sayısı. Bu sınıra ulaşılırsa, sunucu akış öğelerini işleyene kadar çağrıların işlenmesi engellenir.
MaximumReceiveMessageSize 32 KB Tek bir gelen hub iletisinin boyutu üst sınırı. Değerin artırılması Hizmet reddi (DoS) saldırıları riskini artırabilir.
MaximumParallelInvocationsPerClient 1 Her istemcinin kuyruğa almadan önce paralel olarak çağırabileceği en fazla hub yöntemi sayısı.

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Startup.ConfigureServicesiçin yapılandırılabilir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubStartup.Configuregeçirilerek yapılandırılır.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 32 KB İstemciden alınan ve sunucunun geri baskı uygulamadan önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, sunucunun geri baskı uygulamadan daha hızlı bir şekilde daha büyük iletiler almasına olanak tanır, ancak bellek tüketimini artırabilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
TransportMaxBufferSize 32 KB Uygulamanın geri baskıyı gözlemlemeden önce arabelleğe aldığı en fazla bayt sayısı. Bu değerin artırılması, sunucunun geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.
MinimumProtocolVersion 0 Anlaşma protokolünün en düşük sürümünü belirtin. Bu, istemcileri daha yeni sürümlere sınırlamak için kullanılır.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel Bir değer yerine, günlük düzeyi adını temsil eden bir string değer de sağlayabilirsiniz. Sabitlere erişiminiz olmayan ortamlarda günlüğe kaydetmeyi LogLevel yapılandırırken SignalR bu yararlı olur.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

Aşağıdaki tablo kullanılabilir günlük düzeylerini listeler. Sağlamak için sağladığınız değer, günlüğe configureLoggingkaydedilecek en düşük günlük düzeyini ayarlar. Bu düzeyde günlüğe kaydedilen iletiler veya tabloda ondan sonra listelenen düzeyler günlüğe kaydedilir.

String GünlükDüzeyi
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Java istemcisi websockets'in bu sürümünde tek kullanılabilir aktarımdır.

Java istemcisinde aktarım, üzerindeki HttpHubConnectionBuilderyöntemiyle withTransport seçilir. Java istemcisi varsayılan olarak WebSockets aktarımını kullanır.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Dekont

SignalR Java istemcisi henüz aktarım geri dönüşünü desteklemez.

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Nesnenin kendisinde zaman aşımı ve canlı tutma davranışını yapılandırmaya HubConnection yönelik ek seçenekler vardır:

Seçenek Varsayılan değer Tanım
ServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, pinglerin gelmesi için zaman tanıyacak şekilde sunucunun KeepAliveInterval değerinin en az iki katıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye İstemcinin ping iletileri gönderdiği aralığı belirler. İstemciden herhangi bir ileti göndererek zamanlayıcıyı aralığın başlangıcına sıfırlar. İstemci sunucudaki kümede ClientTimeoutInterval bir ileti göndermediyse, sunucu istemcinin bağlantısının kesileceğini düşünür.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirme, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir. AddJsonProtocol içinde sonra AddSignalRProgram.cseklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerOptions nesnedeki özelliği, bağımsız değişkenlerin serileştirmesini ve dönüş değerlerini yapılandırmak için kullanılabilecek bir System.Text.JsonJsonSerializerOptions nesnedir. Daha fazla bilgi için System.Text.Json belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine özellik adlarının büyük/küçük harflerini değiştirmeyecek şekilde yapılandırmak için içinde Program.csaşağıdaki kodu kullanın:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

Newtonsoft.Json'a geçiş yapma

içinde desteklenmeyen Newtonsoft.Json özelliklerine ihtiyacınız varsa bkz. geçiş yapmaNewtonsoft.Json.System.Text.Json

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ClientTimeoutInterval 30 saniye Sunucu, bu aralıkta bir ileti (canlı tutma dahil) almadıysa istemcinin bağlantısının kesilmiş olduğunu düşünür. Bunun uygulanması nedeniyle istemcinin bağlantısı kesildi olarak işaretlenmesi bu zaman aşımı aralığından daha uzun sürebilir. Önerilen değer, değerin iki katıdır KeepAliveInterval .
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .
StreamBufferCapacity 10 İstemci karşıya yükleme akışları için arabelleğe alınabilecek en fazla öğe sayısı. Bu sınıra ulaşılırsa, sunucu akış öğelerini işleyene kadar çağrıların işlenmesi engellenir.
MaximumReceiveMessageSize 32 KB Tek bir gelen hub iletisinin boyutu üst sınırı. Değerin artırılması Hizmet reddi (DoS) saldırıları riskini artırabilir.
MaximumParallelInvocationsPerClient 1 Her istemcinin kuyruğa almadan önce paralel olarak çağırabileceği en fazla hub yöntemi sayısı.

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Program.csiçin yapılandırılabilir.

builder.Services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubProgram.csgeçirilerek yapılandırılır.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 64 KB İstemciden alınan ve sunucunun geri baskı uygulamadan önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, sunucunun geri baskı uygulamadan daha büyük iletileri daha hızlı almasını sağlar, ancak bellek tüketimini artırabilir.
TransportMaxBufferSize 64 KB Uygulamanın geri baskıyı gözlemlemeden önce arabelleğe aldığı en fazla bayt sayısı. Bu değerin artırılması, sunucunun geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.
MinimumProtocolVersion 0 Anlaşma protokolünün en düşük sürümünü belirtin. Bu, istemcileri daha yeni sürümlere sınırlamak için kullanılır.
CloseOnAuthenticationExpiration false Bir belirtecin süresi dolduğunda bağlantıları kapatacak kimlik doğrulaması süre sonu izlemeyi etkinleştirmek için bu seçeneği ayarlayın.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel Bir değer yerine, günlük düzeyi adını temsil eden bir string değer de sağlayabilirsiniz. Sabitlere erişiminiz olmayan ortamlarda günlüğe kaydetmeyi LogLevel yapılandırırken SignalR bu yararlı olur.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

Aşağıdaki tablo kullanılabilir günlük düzeylerini listeler. Sağlamak için sağladığınız değer, günlüğe configureLoggingkaydedilecek en düşük günlük düzeyini ayarlar. Bu düzeyde günlüğe kaydedilen iletiler veya tabloda ondan sonra listelenen düzeyler günlüğe kaydedilir.

String GünlükDüzeyi
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Java istemcisi websockets'in bu sürümünde tek kullanılabilir aktarımdır.

Java istemcisinde aktarım, üzerindeki HttpHubConnectionBuilderyöntemiyle withTransport seçilir. Java istemcisi varsayılan olarak WebSockets aktarımını kullanır.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Dekont

SignalR Java istemcisi henüz aktarım geri dönüşünü desteklemez.

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Nesnenin kendisinde zaman aşımı ve canlı tutma davranışını yapılandırmaya HubConnection yönelik ek seçenekler vardır:

Seçenek Varsayılan değer Tanım
ServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, pinglerin gelmesi için zaman tanıyacak şekilde sunucunun KeepAliveInterval değerinin en az iki katıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye İstemcinin ping iletileri gönderdiği aralığı belirler. İstemciden herhangi bir ileti göndererek zamanlayıcıyı aralığın başlangıcına sıfırlar. İstemci sunucudaki kümede ClientTimeoutInterval bir ileti göndermediyse, sunucu istemcinin bağlantısının kesileceğini düşünür.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.
ApplicationMaxBufferSize 1 MB İstemcinin geri baskı uygulamadan önce sunucudan aldığı maksimum bayt sayısı. Bu değerin artırılması, istemcinin geri baskı uygulamadan daha büyük iletileri daha hızlı almasını sağlar, ancak bellek tüketimini artırabilir.
TransportMaxBufferSize 1 MB kullanıcı uygulaması tarafından gönderilen ve istemcinin geri baskıyı gözlemlemeden önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, istemcinin geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar

JSON/MessagePack serileştirme seçenekleri

ASP.NET Core SignalR , iletileri kodlamak için iki protokolü destekler: JSON ve MessagePack. Her protokolün serileştirme yapılandırma seçenekleri vardır.

JSON serileştirme, uzantı yöntemi kullanılarak AddJsonProtocol sunucuda yapılandırılabilir. AddJsonProtocol içinde sonra AddSignalRStartup.ConfigureServiceseklenebilir. yöntemi, AddJsonProtocol nesne alan bir options temsilci alır. Bu PayloadSerializerOptions nesnedeki özelliği, bağımsız değişkenlerin serileştirmesini ve dönüş değerlerini yapılandırmak için kullanılabilecek bir System.Text.JsonJsonSerializerOptions nesnedir. Daha fazla bilgi için System.Text.Json belgelerine bakın.

Örneğin, seri hale getiriciyi varsayılan deve olayı adları yerine özellik adlarının büyük/küçük harflerini değiştirmeyecek şekilde yapılandırmak için içinde Program.csaşağıdaki kodu kullanın:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET istemcisinde, üzerinde HubConnectionBuilderaynı AddJsonProtocol uzantı yöntemi vardır. Microsoft.Extensions.DependencyInjection Uzantı yöntemini çözümlemek için ad alanının içeri aktarılması gerekir:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Dekont

Şu anda JavaScript istemcisinde ON serileştirmesini yapılandırmak JSmümkün değildir.

Newtonsoft.Json'a geçiş yapma

içinde desteklenmeyen Newtonsoft.Json özelliklerine ihtiyacınız varsa bkz. geçiş yapmaNewtonsoft.Json.System.Text.Json

MessagePack serileştirme seçenekleri

MessagePack serileştirmesi, çağrı için AddMessagePackProtocol bir temsilci sağlanarak yapılandırılabilir. Daha fazla ayrıntı için bkz . messagepack in SignalR .

Dekont

Şu anda JavaScript istemcisinde MessagePack serileştirmeyi yapılandırmak mümkün değildir.

Sunucu seçeneklerini yapılandırma

Aşağıdaki tabloda hub'ları yapılandırma SignalR seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ClientTimeoutInterval 30 saniye Sunucu, bu aralıkta bir ileti (canlı tutma dahil) almadıysa istemcinin bağlantısının kesilmiş olduğunu düşünür. Bunun uygulanması nedeniyle istemcinin bağlantısı kesildi olarak işaretlenmesi bu zaman aşımı aralığından daha uzun sürebilir. Önerilen değer, değerin iki katıdır KeepAliveInterval .
HandshakeTimeout 15 saniye İstemci bu zaman aralığı içinde ilk el sıkışma iletisini göndermezse, bağlantı kapatılır. Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye Sunucu bu aralık içinde bir ileti göndermediyse, bağlantıyı açık tutmak için otomatik olarak bir ping iletisi gönderilir. değiştirirken KeepAliveInterval, istemcideki ServerTimeout veya serverTimeoutInMilliseconds ayarını değiştirin. Önerilen ServerTimeout veya serverTimeoutInMilliseconds değer, değerin iki katıdır KeepAliveInterval .
SupportedProtocols Tüm yüklü protokoller Bu hub tarafından desteklenen protokoller. Varsayılan olarak, sunucuda kayıtlı tüm protokollere izin verilir. Tek tek hub'lar için belirli protokolleri devre dışı bırakmak için protokoller bu listeden kaldırılabilir.
EnableDetailedErrors false bir Hub yönteminde bir özel durum oluştuğunda istemcilere ayrıntılı özel durum iletileri döndürülür.true Varsayılan değer, bu özel durum iletilerinin hassas bilgiler içerebileceğindendir false .
StreamBufferCapacity 10 İstemci karşıya yükleme akışları için arabelleğe alınabilecek en fazla öğe sayısı. Bu sınıra ulaşılırsa, sunucu akış öğelerini işleyene kadar çağrıların işlenmesi engellenir.
MaximumReceiveMessageSize 32 KB Tek bir gelen hub iletisinin boyutu üst sınırı. Değerin artırılması Hizmet reddi (DoS) saldırıları riskini artırabilir.
MaximumParallelInvocationsPerClient 1 Her istemcinin kuyruğa almadan önce paralel olarak çağırabileceği en fazla hub yöntemi sayısı.
DisableImplicitFromServicesParameters false Hub yöntemi bağımsız değişkenleri mümkünse DI'den çözümlenir.

Seçenekleri, içinde arama için bir seçenek temsilcisi AddSignalR sağlayarak tüm hub'lar Program.csiçin yapılandırılabilir.

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

Tek bir hub için seçenekler, içinde AddSignalR sağlanan genel seçenekleri geçersiz kılar ve kullanılarak AddHubOptionsyapılandırılabilir:

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Gelişmiş HTTP yapılandırma seçenekleri

Aktarımlar ve bellek arabelleği yönetimiyle ilgili gelişmiş ayarları yapılandırmak için kullanın HttpConnectionDispatcherOptions . Bu seçenekler içinde bir temsilci MapHubProgram.csgeçirilerek yapılandırılır.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

Aşağıdaki tabloda, ASP.NET Core'un SignalRgelişmiş HTTP seçeneklerini yapılandırma seçenekleri açıklanmaktadır:

Seçenek Varsayılan Değer Tanım
ApplicationMaxBufferSize 64 KB İstemciden alınan ve sunucunun geri baskı uygulamadan önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, sunucunun geri baskı uygulamadan daha büyük iletileri daha hızlı almasını sağlar, ancak bellek tüketimini artırabilir.
TransportMaxBufferSize 64 KB Uygulamanın geri baskıyı gözlemlemeden önce arabelleğe aldığı en fazla bayt sayısı. Bu değerin artırılması, sunucunun geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.
AuthorizationData Hub sınıfına Authorize uygulanan özniteliklerden otomatik olarak toplanan veriler. İstemcinin hub'a IAuthorizeData bağlanma yetkisi olup olmadığını belirlemek için kullanılan nesnelerin listesi.
Transports Tüm Aktarımlar etkinleştirilir. Bit, bir istemcinin HttpTransportType bağlanmak için kullanabileceği aktarımları kısıtlayan değerlerin sabit listesi olarak işaret eder.
LongPolling Aşağıya bakın. Uzun Yoklama aktarımına özgü ek seçenekler.
WebSockets Aşağıya bakın. WebSockets aktarımına özgü ek seçenekler.
MinimumProtocolVersion 0 Anlaşma protokolünün en düşük sürümünü belirtin. Bu, istemcileri daha yeni sürümlere sınırlamak için kullanılır.
CloseOnAuthenticationExpiration false Bir belirtecin süresi dolduğunda bağlantıları kapatacak kimlik doğrulaması süre sonu izlemeyi etkinleştirmek için bu seçeneği ayarlayın.

Uzun Yoklama aktarımı, özelliği kullanılarak yapılandırılabilir ek seçeneklere LongPolling sahiptir:

Seçenek Varsayılan Değer Tanım
PollTimeout 90 saniye Sunucunun tek bir yoklama isteğini sonlandırmadan önce istemciye ileti göndermesini beklediği en uzun süre. Bu değerin azaltılması, istemcinin yeni yoklama isteklerini daha sık vermesine neden olur.

WebSocket aktarım, özelliği kullanılarak yapılandırılabilir ek seçeneklere WebSockets sahiptir:

Seçenek Varsayılan Değer Tanım
CloseTimeout 5 saniye Sunucu kapatıldıktan sonra, istemci bu zaman aralığı içinde kapatılamazsa bağlantı sonlandırılır.
SubProtocolSelector null Üst bilgiyi özel bir değere ayarlamak Sec-WebSocket-Protocol için kullanılabilecek bir temsilci. Temsilci, istemci tarafından istenen değerleri giriş olarak alır ve istenen değeri döndürmesi beklenir.

İstemci seçeneklerini yapılandırma

İstemci seçenekleri türüne göre HubConnectionBuilder yapılandırılabilir (.NET ve JavaScript istemcilerinde kullanılabilir). Java istemcisinde de kullanılabilir, ancak HttpHubConnectionBuilder oluşturucu yapılandırma seçeneklerinin yanı sıra HubConnection kendisinde de alt sınıf bulunur.

Günlük kaydetmeyi yapılandırma

Günlüğe kaydetme yöntemi kullanılarak .NET İstemcisi'nde ConfigureLogging yapılandırılır. Günlüğe kaydetme sağlayıcıları ve filtreler, sunucudaki gibi kaydedilebilir. Daha fazla bilgi için ASP.NET Core'da oturum açma belgelerine bakın.

Dekont

Günlük sağlayıcılarını kaydetmek için gerekli paketleri yüklemeniz gerekir. Tam liste için belgelerin Yerleşik günlük sağlayıcıları bölümüne bakın.

Örneğin, Konsol günlüğünü etkinleştirmek için NuGet paketini yükleyin Microsoft.Extensions.Logging.Console . Uzantı yöntemini çağırın AddConsole :

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript istemcisinde benzer configureLogging bir yöntem vardır. Üretilmesi gereken günlük iletilerinin en düşük düzeyini gösteren bir LogLevel değer sağlayın. Günlükler tarayıcı konsolu penceresine yazılır.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel Bir değer yerine, günlük düzeyi adını temsil eden bir string değer de sağlayabilirsiniz. Sabitlere erişiminiz olmayan ortamlarda günlüğe kaydetmeyi LogLevel yapılandırırken SignalR bu yararlı olur.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

Aşağıdaki tablo kullanılabilir günlük düzeylerini listeler. Sağlamak için sağladığınız değer, günlüğe configureLoggingkaydedilecek en düşük günlük düzeyini ayarlar. Bu düzeyde günlüğe kaydedilen iletiler veya tabloda ondan sonra listelenen düzeyler günlüğe kaydedilir.

String GünlükDüzeyi
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Dekont

Günlüğü tamamen devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging .

Günlüğe kaydetme hakkında daha fazla bilgi için Tanılama belgelerine SignalR bakın.

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Bu, güvenli bir şekilde yoksayılabilir.

İzin verilen aktarımları yapılandırma

tarafından SignalR kullanılan aktarımlar çağrısında WithUrl (withUrl JavaScript'te) yapılandırılabilir. bit düzeyinde VEYA değerleri HttpTransportType , istemciyi yalnızca belirtilen aktarımları kullanacak şekilde kısıtlamak için kullanılabilir. Tüm aktarımlar varsayılan olarak etkindir.

Örneğin, Sunucu Tarafından Gönderilen Olaylar aktarımını devre dışı bırakmak, ancak WebSockets ve Uzun Yoklama bağlantılarına izin vermek için:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript istemcisinde aktarımlar, sağlanan withUrlseçenekler nesnesindeki transport alanı olarak ayarlanarak yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Java istemcisi websockets'in bu sürümünde tek kullanılabilir aktarımdır.

Java istemcisinde aktarım, üzerindeki HttpHubConnectionBuilderyöntemiyle withTransport seçilir. Java istemcisi varsayılan olarak WebSockets aktarımını kullanır.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Dekont

SignalR Java istemcisi henüz aktarım geri dönüşünü desteklemez.

Taşıyıcı kimlik doğrulamayı yapılandırma

İsteklerle SignalR birlikte kimlik doğrulama verileri sağlamak için seçeneğini (accessTokenFactoryJavaScript'te) kullanarak AccessTokenProvider istenen erişim belirtecini döndüren bir işlev belirtin. .NET İstemcisi'nde, bu erişim belirteci bir HTTP "Taşıyıcı Kimlik Doğrulaması" belirteci olarak geçirilir (üst bilgi türüyle Bearerbirlikte kullanılırAuthorization). JavaScript istemcisinde, tarayıcı API'lerinin üst bilgi uygulama özelliğini kısıtladığı birkaç durum dışında erişim belirteci Taşıyıcı belirteci olarak kullanılır (özellikle Sunucu Tarafından Gönderilen Olaylar ve WebSockets isteklerinde). Böyle durumlarda erişim belirteci sorgu dizesi değeri access_tokenolarak sağlanır.

.NET istemcisinde seçeneği, AccessTokenProvider içindeki WithUrlseçenekler temsilcisi kullanılarak belirtilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript istemcisinde, erişim belirteci içindeki seçenekler nesnesinde withUrlalanı ayarlanarak accessTokenFactory yapılandırılır:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

Java istemcisindeSignalR, HttpHub Bağlan ionBuilder'a erişim belirteci fabrikası sağlayarak bir taşıyıcı belirteci kimlik doğrulaması için kullanılacak şekilde yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Zaman aşımı ve etkin tutma seçeneklerini yapılandırma

Nesnenin kendisinde zaman aşımı ve canlı tutma davranışını yapılandırmaya HubConnection yönelik ek seçenekler vardır:

Seçenek Varsayılan değer Tanım
ServerTimeout 30 saniye (30.000 milisaniye) Sunucu etkinliği için zaman aşımı. Sunucu bu aralıkta bir ileti göndermediyse, istemci sunucunun bağlantısının kesileceğini düşünür ve olayı tetikler Closed (onclose JavaScript'te). Bu değer, bir ping iletisinin sunucudan gönderilmesi ve zaman aşımı aralığı içinde istemci tarafından alınması için yeterince büyük olmalıdır. Önerilen değer, pinglerin gelmesi için zaman tanıyacak şekilde sunucunun KeepAliveInterval değerinin en az iki katıdır.
HandshakeTimeout 15 saniye İlk sunucu el sıkışması için zaman aşımı. Sunucu bu aralıkta el sıkışma yanıtı göndermezse, istemci el sıkışmayı iptal eder ve olayı tetikler Closed (onclose JavaScript'te). Bu, yalnızca ciddi ağ gecikme süresi nedeniyle el sıkışma zaman aşımı hataları oluşuyorsa değiştirilmesi gereken gelişmiş bir ayardır. El sıkışma işlemi hakkında daha fazla ayrıntı için bkz SignalR . Hub Protokolü Belirtimi.
KeepAliveInterval 15 saniye İstemcinin ping iletileri gönderdiği aralığı belirler. İstemciden herhangi bir ileti göndererek zamanlayıcıyı aralığın başlangıcına sıfırlar. İstemci sunucudaki kümede ClientTimeoutInterval bir ileti göndermediyse, sunucu istemcinin bağlantısının kesileceğini düşünür.

.NET İstemcisi'nde zaman aşımı değerleri değer olarak TimeSpan belirtilir.

Ek seçenekleri yapılandırma

Java istemcisindeki çeşitli yapılandırma API'lerinde WithUrlHttpHubConnectionBuilder (withUrlJavaScript'te) yönteminde HubConnectionBuilder ek seçenekler yapılandırılabilir:

.NET Seçeneği Varsayılan değer Tanım
AccessTokenProvider null HTTP isteklerinde Taşıyıcı kimlik doğrulama belirteci olarak sağlanan bir dize döndüren işlev.
SkipNegotiation false Anlaşma adımını atlamak için bunu true olarak ayarlayın. Yalnızca WebSockets aktarımı etkinleştirilen tek aktarım olduğunda desteklenir. Azure SignalR Hizmeti kullanılırken bu ayar etkinleştirilemiyor.
ClientCertificates Boş İsteklerin kimliğini doğrulamak için gönderilecek TLS sertifikaları koleksiyonu.
Cookies Boş Her HTTP cookieisteğiyle gönderilecek BIR HTTP s koleksiyonu.
Credentials Boş Her HTTP isteğiyle gönderilecek kimlik bilgileri.
CloseTimeout 5 saniye Yalnızca WebSockets. İstemcinin kapatma isteğini kabul etmek için sunucunun kapatılmasını beklediği en uzun süre. Sunucu bu süre içinde kapanışı kabul etmezse istemcinin bağlantısı kesilir.
Headers Boş Her HTTP isteğiyle gönderilecek ek HTTP üst bilgilerinin haritası.
HttpMessageHandlerFactory null HTTP istekleri göndermek için kullanılan öğesini HttpMessageHandler yapılandırmak veya değiştirmek için kullanılabilecek bir temsilci. WebSocket bağlantıları için kullanılmaz. Bu temsilci null olmayan bir değer döndürmelidir ve varsayılan değeri parametre olarak alır. Bu varsayılan değerdeki ayarları değiştirip döndür ya da yeni HttpMessageHandler bir örnek döndür. İşleyiciyi değiştirirken, sağlanan işleyiciden saklamak istediğiniz ayarları kopyaladığınızdan emin olun; aksi takdirde, yapılandırılan seçenekler (s ve Üst Bilgiler gibi Cookie) yeni işleyiciye uygulanmaz.
Proxy null HTTP istekleri gönderirken kullanılacak bir HTTP proxy'si.
UseDefaultCredentials false Bu boole değerini HTTP ve WebSockets istekleri için varsayılan kimlik bilgilerini gönderecek şekilde ayarlayın. Bu, Windows kimlik doğrulamasının kullanılmasını sağlar.
WebSocketConfiguration null Ek WebSocket seçeneklerini yapılandırmak için kullanılabilecek bir temsilci. Seçenekleri yapılandırmak için kullanılabilecek bir örneğini ClientWebSocketOptions alır.
ApplicationMaxBufferSize 1 MB İstemcinin geri baskı uygulamadan önce sunucudan aldığı maksimum bayt sayısı. Bu değerin artırılması, istemcinin geri baskı uygulamadan daha büyük iletileri daha hızlı almasını sağlar, ancak bellek tüketimini artırabilir.
TransportMaxBufferSize 1 MB kullanıcı uygulaması tarafından gönderilen ve istemcinin geri baskıyı gözlemlemeden önce arabelleğe aldığı bayt sayısı üst sınırı. Bu değerin artırılması, istemcinin geri baskıyı beklemeden daha büyük iletileri daha hızlı arabelleğe almasına olanak tanır, ancak bellek tüketimini artırabilir.

.NET İstemcisi'nde, bu seçenekler için sağlanan WithUrlseçenekler temsilcisi tarafından değiştirilebilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript İstemcisi'nde, bu seçenekler için withUrlsağlanan bir JavaScript nesnesinde sağlanabilir:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java istemcisinde, bu seçenekler HttpHubConnectionBuilderHubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Ek kaynaklar