Konfigurasi ASP.NET Core SignalR

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi pada server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.JsonJsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.

Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Program.cs:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Beralih ke Newtonsoft.Json

Jika Anda memerlukan fitur Newtonsoft.Json yang tidak didukung di System.Text.Json, lihat Beralih ke Newtonsoft.Json.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval .
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.
StreamBufferCapacity 10 Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming.
MaximumReceiveMessageSize 32 KB Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS).
MaximumParallelInvocationsPerClient 1 Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre.
DisableImplicitFromServicesParameters false Argumen metode hub akan diselesaikan dari DI jika memungkinkan.

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Program.cs.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Program.cs.

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();

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 64 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
TransportMaxBufferSize 64 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.
MinimumProtocolVersion 0 Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru.
CloseOnAuthenticationExpiration salah Atur opsi ini untuk mengaktifkan pelacakan kedaluwarsa autentikasi yang akan menutup koneksi saat token kedaluwarsa.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Alih-alih LogLevel nilai, Anda juga dapat memberikan nilai yang string mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel konstanta.

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

Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoatauinformation LogLevel.Information
warnatauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Dalam versi websocket klien Java ini adalah satu-satunya transportasi yang tersedia.

Di klien Java, transportasi dipilih dengan withTransport metode pada HttpHubConnectionBuilder. Klien Java default menggunakan transportasi WebSockets.

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

Catatan

Klien SignalR Java belum mendukung fallback transportasi.

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup:

Opsi Nilai default Deskripsi
WithServerTimeout 30 detik (30.000 milidetik) Batas waktu untuk aktivitas server dan diatur langsung pada HubConnectionBuilder. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai interval tetap hidup (WithKeepAliveInterval) server untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal dan tersedia pada objek itu HubConnection sendiri. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
WithKeepAliveInterval 15 detik Menentukan interval di mana klien mengirim pesan ping dan diatur langsung pada HubConnectionBuilder. Pengaturan ini memungkinkan server mendeteksi pemutusan sambungan keras, seperti ketika klien mencabut sambungan komputernya dari jaringan. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Contoh berikut menunjukkan nilai yang menggandakan nilai default:

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();

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.
ApplicationMaxBufferSize 1 MB Jumlah maksimum byte yang diterima dari server yang di-buffer klien sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan klien untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
TransportMaxBufferSize 1 MB Jumlah maksimum byte yang dikirim oleh aplikasi pengguna yang di-buffer klien sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan klien untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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();

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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();

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan:

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi di server menggunakan AddJsonProtocol metode ekstensi, yang dapat ditambahkan setelah AddSignalR dalam metode Anda Startup.ConfigureServices . Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerSettings adalah objek Json.NET JsonSerializerSettings yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi Json.NET.

Misalnya, untuk mengonfigurasi serializer untuk menggunakan nama properti "PascalCase", daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Startup.ConfigureServices.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure.

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

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

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 32 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
TransportMaxBufferSize 32 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server. Meningkatkan nilai ini memungkinkan server mengirim pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection sendiri:

Opsi Nilai default Deskripsi
ServerTimeout 30 detik (30.000 milidetik) Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan:

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi di server menggunakan AddJsonProtocol metode ekstensi, yang dapat ditambahkan setelah AddSignalR dalam metode Anda Startup.ConfigureServices . Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerSettings adalah objek Json.NET JsonSerializerSettings yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi Json.NET.

Misalnya, untuk mengonfigurasi serializer untuk menggunakan nama properti "PascalCase", daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval .
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Startup.ConfigureServices.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure.

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

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

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 32 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
TransportMaxBufferSize 32 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server. Meningkatkan nilai ini memungkinkan server mengirim pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Dalam versi websocket klien Java ini adalah satu-satunya transportasi yang tersedia.

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection sendiri:

Opsi Nilai default Deskripsi
ServerTimeout 30 detik (30.000 milidetik) Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan:

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi pada server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.JsonJsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.

Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Beralih ke Newtonsoft.Json

Jika Anda memerlukan fitur Newtonsoft.Json yang tidak didukung di System.Text.Json, lihat Beralih ke Newtonsoft.Json.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval .
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.
StreamBufferCapacity 10 Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming.
MaximumReceiveMessageSize 32 KB Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS).

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Startup.ConfigureServices.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure.

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

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

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 32 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar dengan lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
TransportMaxBufferSize 32 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Alih-alih LogLevel nilai, Anda juga dapat memberikan nilai yang string mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel konstanta.

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

Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoatauinformation LogLevel.Information
warnatauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Dalam versi websocket klien Java ini adalah satu-satunya transportasi yang tersedia.

Di klien Java, transportasi dipilih dengan withTransport metode pada HttpHubConnectionBuilder. Klien Java default menggunakan transportasi WebSockets.

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

Catatan

Klien SignalR Java belum mendukung fallback transportasi.

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection sendiri:

Opsi Nilai default Deskripsi
ServerTimeout 30 detik (30.000 milidetik) Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan:

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi pada server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.JsonJsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.

Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Beralih ke Newtonsoft.Json

Jika Anda memerlukan fitur Newtonsoft.Json yang tidak didukung di System.Text.Json, lihat Beralih ke Newtonsoft.Json.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval .
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.
StreamBufferCapacity 10 Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming.
MaximumReceiveMessageSize 32 KB Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS).

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Startup.ConfigureServices.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure.

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

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

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 32 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar dengan lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
TransportMaxBufferSize 32 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.
MinimumProtocolVersion 0 Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Alih-alih LogLevel nilai, Anda juga dapat memberikan nilai yang string mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel konstanta.

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

Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoatauinformation LogLevel.Information
warnatauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Dalam versi websocket klien Java ini adalah satu-satunya transportasi yang tersedia.

Di klien Java, transportasi dipilih dengan withTransport metode pada HttpHubConnectionBuilder. Klien Java default menggunakan transportasi WebSockets.

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

Catatan

Klien SignalR Java belum mendukung fallback transportasi.

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection sendiri:

Opsi Nilai default Deskripsi
ServerTimeout 30 detik (30.000 milidetik) Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan:

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi pada server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.JsonJsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.

Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Beralih ke Newtonsoft.Json

Jika Anda memerlukan fitur Newtonsoft.Json yang tidak didukung di System.Text.Json, lihat Beralih ke Newtonsoft.Json.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval .
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.
StreamBufferCapacity 10 Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming.
MaximumReceiveMessageSize 32 KB Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS).
MaximumParallelInvocationsPerClient 1 Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre.

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Startup.ConfigureServices.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure.

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

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

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 32 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar dengan lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
TransportMaxBufferSize 32 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.
MinimumProtocolVersion 0 Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Alih-alih LogLevel nilai, Anda juga dapat memberikan nilai yang string mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel konstanta.

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

Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoatauinformation LogLevel.Information
warnatauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Dalam versi websocket klien Java ini adalah satu-satunya transportasi yang tersedia.

Di klien Java, transportasi dipilih dengan withTransport metode pada HttpHubConnectionBuilder. Klien Java default menggunakan transportasi WebSockets.

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

Catatan

Klien SignalR Java belum mendukung fallback transportasi.

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection sendiri:

Opsi Nilai default Deskripsi
ServerTimeout 30 detik (30.000 milidetik) Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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();

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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();

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan:

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi pada server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Program.cs. Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.JsonJsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.

Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Program.cs:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Beralih ke Newtonsoft.Json

Jika Anda memerlukan fitur Newtonsoft.Json yang tidak didukung di System.Text.Json, lihat Beralih ke Newtonsoft.Json.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval .
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.
StreamBufferCapacity 10 Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming.
MaximumReceiveMessageSize 32 KB Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS).
MaximumParallelInvocationsPerClient 1 Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre.

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Program.cs.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Program.cs.

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();

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 64 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
TransportMaxBufferSize 64 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.
MinimumProtocolVersion 0 Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru.
CloseOnAuthenticationExpiration salah Atur opsi ini untuk mengaktifkan pelacakan kedaluwarsa autentikasi yang akan menutup koneksi saat token kedaluwarsa.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Alih-alih LogLevel nilai, Anda juga dapat memberikan nilai yang string mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel konstanta.

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

Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoatauinformation LogLevel.Information
warnatauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Dalam versi websocket klien Java ini adalah satu-satunya transportasi yang tersedia.

Di klien Java, transportasi dipilih dengan withTransport metode pada HttpHubConnectionBuilder. Klien Java default menggunakan transportasi WebSockets.

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

Catatan

Klien SignalR Java belum mendukung fallback transportasi.

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection sendiri:

Opsi Nilai default Deskripsi
ServerTimeout 30 detik (30.000 milidetik) Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.
ApplicationMaxBufferSize 1 MB Jumlah maksimum byte yang diterima dari server yang di-buffer klien sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan klien untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
TransportMaxBufferSize 1 MB Jumlah maksimum byte yang dikirim oleh aplikasi pengguna yang di-buffer klien sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan klien untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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();

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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();

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan:

JSOpsi serialisasi ON/MessagePack

ASP.NET Core SignalR mendukung dua protokol untuk mengodekan pesan: JSON dan MessagePack. Setiap protokol memiliki opsi konfigurasi serialisasi.

JSSerialisasi ON dapat dikonfigurasi pada server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode ini AddJsonProtocol mengambil delegasi yang menerima options objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.JsonJsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.

Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Program.cs:

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

Di klien .NET, metode ekstensi yang sama AddJsonProtocol ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection harus diimpor untuk menyelesaikan metode ekstensi:

// 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();

Catatan

Tidak dimungkinkan untuk mengonfigurasi JSserialisasi ON di klien JavaScript saat ini.

Beralih ke Newtonsoft.Json

Jika Anda memerlukan fitur Newtonsoft.Json yang tidak didukung di System.Text.Json, lihat Beralih ke Newtonsoft.Json.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.

Catatan

Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.

Mengonfigurasi opsi server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Default Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval .
HandshakeTimeout 15 detik Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval, ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval.serverTimeoutInMilliseconds
SupportedProtocols Semua protokol yang terinstal Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual.
EnableDetailedErrors false Jika true, pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif.
StreamBufferCapacity 10 Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming.
MaximumReceiveMessageSize 32 KB Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS).
MaximumParallelInvocationsPerClient 1 Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre.
DisableImplicitFromServicesParameters false Argumen metode hub akan diselesaikan dari DI jika memungkinkan.

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR panggilan di Program.cs.

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

Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR menggunakan AddHubOptions:

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

Opsi konfigurasi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Program.cs.

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();

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:

Opsi Nilai Default Deskripsi
ApplicationMaxBufferSize 64 KB Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
TransportMaxBufferSize 64 KB Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.
AuthorizationData Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub.
Transports Semua Transportasi diaktifkan. Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan.
LongPolling Lihat bawah. Opsi tambahan khusus untuk transportasi Long Polling.
WebSockets Lihat bawah. Opsi tambahan khusus untuk transportasi WebSockets.
MinimumProtocolVersion 0 Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru.
CloseOnAuthenticationExpiration salah Atur opsi ini untuk mengaktifkan pelacakan kedaluwarsa autentikasi yang akan menutup koneksi saat token kedaluwarsa.

Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling properti :

Opsi Nilai Default Deskripsi
PollTimeout 90 detik Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru.

Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets properti :

Opsi Nilai Default Deskripsi
CloseTimeout 5 detik Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan.
SubProtocolSelector null Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan.

Mengonfigurasi opsi klien

Opsi klien dapat dikonfigurasi pada HubConnectionBuilder jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.

Catatan

Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.

Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console paket NuGet. AddConsole Panggil metode ekstensi:

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

Di klien JavaScript, ada metode serupa configureLogging . Berikan nilai yang LogLevel menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.

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

Alih-alih LogLevel nilai, Anda juga dapat memberikan nilai yang string mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel konstanta.

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

Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoatauinformation LogLevel.Information
warnatauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Catatan

Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None dalam configureLogging metode .

Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.

Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging dengan SignalR klien Java.

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

Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:

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.

Ini dapat diabaikan dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl panggilan (withUrl di JavaScript). Bitwise-OR dari nilai HttpTransportType dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:

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

Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport bidang pada objek opsi yang disediakan untuk withUrl:

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

Dalam versi websocket klien Java ini adalah satu-satunya transportasi yang tersedia.

Di klien Java, transportasi dipilih dengan withTransport metode pada HttpHubConnectionBuilder. Klien Java default menggunakan transportasi WebSockets.

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

Catatan

Klien SignalR Java belum mendukung fallback transportasi.

Mengonfigurasi autentikasi pembawa

Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider opsi (accessTokenFactory di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization header dengan jenis Bearer). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, AccessTokenProvider opsi dapat ditentukan menggunakan delegasi opsi di WithUrl:

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

Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory bidang pada objek opsi di withUrl:

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();

SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHub Koneksi ionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.

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

Mengonfigurasi waktu habis dan opsi tetap hidup

Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection sendiri:

Opsi Nilai default Deskripsi
ServerTimeout 30 detik (30.000 milidetik) Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba.
HandshakeTimeout 15 detik Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub.
KeepAliveInterval 15 detik Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus.

Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan nilai.

Mengonfigurasi opsi tambahan

Opsi tambahan dapat dikonfigurasi dalam WithUrl metode (withUrl dalam JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java:

Opsi .NET Nilai default Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP.
SkipNegotiation false Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR .
ClientCertificates Kosong Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan HTTP cookieuntuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial untuk dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik WebSocket saja. Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.
Headers Kosong Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti Cookies dan Header) tidak akan berlaku untuk handler baru.
Proxy null Proksi HTTP yang akan digunakan saat mengirim permintaan HTTP.
UseDefaultCredentials false Atur boolean ini untuk mengirim kredensial default untuk permintaan HTTP dan WebSockets. Ini memungkinkan penggunaan autentikasi Windows.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi opsi WebSocket tambahan. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.
ApplicationMaxBufferSize 1 MB Jumlah maksimum byte yang diterima dari server yang di-buffer klien sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan klien untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori.
TransportMaxBufferSize 1 MB Jumlah maksimum byte yang dikirim oleh aplikasi pengguna yang di-buffer klien sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan klien untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori.

Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl:

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();

Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl:

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();

Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder dikembalikan dari HubConnectionBuilder.create("HUB URL")

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

Sumber Daya Tambahan: