Konfigurasi ASP.NET Core SignalR

Artikel ini menjelaskan cara mengonfigurasi opsi klien dan server untuk ASP.NET Core SignalR.

Untuk BlazorSignalR panduan, yang menambahkan atau menggantikan panduan dalam artikel ini, lihat panduan ASP.NET CoreBlazorSignalR.

Mengonfigurasi serialisasi untuk mengodekan pesan

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

Opsi serialisasi JSON

Serialisasi JSON dapat dikonfigurasi di server dengan menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah metode AddSignalR dalam Startup.ConfigureServices. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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 kapitalisasi nama properti, alih-alih menggunakan nama camel case bawaan, gunakan kode berikut di file 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();

Nota

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

Beralih ke Newtonsoft.Json

Jika aplikasi Anda memerlukan fitur dalam paket Newtonsoft.Json yang tidak didukung di System.Text.Json, lihat Switch ke Newtonsoft.Json.

Opsi serialisasi MessagePack

Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi untuk panggilan AddMessagePackProtocol. Untuk informasi selengkapnya, lihat MessagePack di SignalR.

Nota

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

Konfigurasi pilihan server

Tabel berikut menjelaskan opsi untuk mengonfigurasi SignalR hub.

Opsi Nilai standar Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika tidak menerima pesan (termasuk keep-alive) dalam interval ini. Mungkin diperlukan waktu lebih lama daripada batas waktu ini sebelum klien dianggap terputus karena cara fitur 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. Opsi 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 Interval saat pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat Anda mengubah nilai KeepAliveInterval, ubah pengaturan ServerTimeout atau serverTimeoutInMilliseconds di klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 Ketika opsi ini diaktifkan (true), pesan pengecualian terperinci dikembalikan ke klien ketika 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. Ketika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming.
MaximumReceiveMessageSize 32 KB Ukuran maksimum untuk satu pesan masuk hub. 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. Perhatikan bahwa batas ini tidak berlaku untuk pemanggilan hub streaming. Untuk informasi selengkapnya, lihat Menggunakan hub di ASP.NET Core SignalR.
DisableImplicitFromServicesParameters false Argumen metode hub ditentukan melalui injeksi dependensi, jika memungkinkan.

Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan delegasi opsi ke pemanggilan AddSignalR dalam file Program.cs.

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

Opsi untuk satu hub mengesampingkan opsi global yang disediakan di AddSignalR dan dapat dikonfigurasi dengan menggunakan metode AddHubOptions:

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

Mengonfigurasi opsi HTTP tingkat lanjut

Gunakan HttpConnectionDispatcherOptions untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegat ke metode MapHub di 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai standar 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 Mengonfigurasi transportasi Long Polling Opsi khusus untuk transportasi Long Polling.
WebSockets Lihat Mengonfigurasi transpor WebSocket Opsi khusus untuk transpor WebSockets.
MinimumProtocolVersion 0 Versi minimum protokol negosiasi. Nilai ini digunakan untuk membatasi klien ke versi protokol yang lebih baru.
CloseOnAuthenticationExpiration false Mengontrol pelacakan kedaluwarsa autentikasi, yang menutup koneksi saat token kedaluwarsa.

Mengonfigurasi transportasi Long Polling

Metode transport Long Polling memiliki opsi lain yang dapat dikonfigurasi dengan menggunakan properti LongPolling:

Opsi Nilai standar 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.

Konfigurasikan transpor WebSocket

Transportasi WebSocket memiliki opsi lain yang dapat dikonfigurasi dengan menggunakan WebSockets properti :

Opsi Nilai standar 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

Di klien .NET dan klien JavaScript, opsi klien dikonfigurasi pada jenis HubConnectionBuilder. Di klien Java, opsi dikonfigurasi pada subkelas HttpHubConnectionBuilder, yang berisi opsi konfigurasi penyusun dan HubConnection itu sendiri.

Mengonfigurasi pengelogan

Pengelogan dikonfigurasi di klien .NET dengan menggunakan metode ConfigureLogging. Penyedia pencatatan log dan filter dapat didaftarkan dengan cara yang sama seperti yang ada di server. Untuk informasi selengkapnya, lihat dokumentasi Logging in ASP.NET Core.

Nota

Untuk mendaftarkan penyedia pengelogan, Anda harus menginstal paket yang diperlukan. Untuk informasi selengkapnya, lihat daftar lengkap penyedia pengelogan bawaan.

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 LogLevel nilai sebagai 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 string nilai yang mewakili nama tingkat log. Pendekatan 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 untuk pengelogan. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, dicatat.

string LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info atauinformation LogLevel.Information
warn atauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

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

Untuk informasi selengkapnya tentang pengelogan, lihat Log dan diagnostik di ASP.NET Core SignalR.

Klien SignalR Java menggunakan pustaka Simple Logging Facade for Java (SLF4J) untuk pencatatan log. 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.

Anda dapat mengabaikan pesan ini dengan aman.

Mengonfigurasi transportasi yang diizinkan

Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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 klien Java ini, WebSockets adalah satu-satunya transportasi yang tersedia.

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

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

Nota

Klien Java SignalR saat ini tidak mendukung mekanisme transport cadangan.

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 header Authorization 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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan dengan menggunakan opsi yang didelegasikan 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();

Di klien SignalR Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan penyedia token akses ke HttpHubConnectionBuilder. Gunakan withAccessTokenProvider untuk memberikan RxJavaSingle<String>. 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 aktif

Bagian ini menjelaskan opsi lain untuk mengonfigurasi batas waktu dan perilaku tetap hidup.

Opsi Nilai standar Deskripsi
WithServerTimeout 30 detik (30.000 milidetik) Nilai batas waktu untuk aktivitas server, yang diatur langsung pada HubConnectionBuilder. Jika server tidak 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 durasi tetap hidup (WithKeepAliveInterval) server untuk memastikan waktu bagi ping untuk tiba.
HandshakeTimeout 15 detik Nilai batas waktu untuk handshake server awal, yang tersedia pada objek HubConnection itu sendiri. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Opsi ini adalah pengaturan lanjutan yang harus dimodifikasi hanya 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 Nilai ini 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 tidak mengirim pesan dalam jangka waktu ClientTimeoutInterval yang ditetapkan di server, server menganggap klien terputus.

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

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 koneksi ulang stateful

SignalR penyambungan ulang stateful mengurangi waktu henti yang dirasakan oleh klien yang mengalami gangguan sementara pada koneksi jaringan mereka, seperti saat berpindah koneksi jaringan atau mengalami hilangnya akses singkat.

Penyambungan ulang stateful menghasilkan waktu henti yang dirasakan melalui:

  • Melakukan buffering data secara sementara di server dan klien.
  • Mengakui pesan yang diterima (ACK-ing) oleh server dan klien.
  • Mengenali kapan koneksi aktif dan memutar ulang pesan yang mungkin dikirim saat koneksi tidak berfungsi.

"Stateful reconnect" tersedia di .NET 8 atau versi yang lebih baru.

Aktifkan penyambungan ulang stateful

Anda dapat mengaktifkan penyambungan ulang stateful baik pada endpoint hub server maupun pada klien.

  • Pada titik akhir hub server, perbarui konfigurasi untuk mengaktifkan AllowStatefulReconnects opsi:

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

    Secara opsional, ukuran buffer maksimum dalam byte yang diizinkan oleh server dapat diatur secara global atau untuk hub tertentu dengan StatefulReconnectBufferSize opsi .

    • Atur opsi StatefulReconnectBufferSize secara global:

      builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
      
    • Atur StatefulReconnectBufferSize opsi untuk hub tertentu:

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

    Pengaturan StatefulReconnectBufferSize bersifat opsional dengan ukuran default 100.000 byte.

  • Pada klien, perbarui kode JavaScript atau TypeScript untuk mengaktifkan withStatefulReconnect opsi:

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

    Pengaturan bufferSize bersifat opsional dengan ukuran default 100.000 byte.

  • Pada klien .NET, perbarui kode untuk mengaktifkan opsi WithStatefulReconnect:

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

    Pengaturan StatefulReconnectBufferSize bersifat opsional dengan ukuran default 100.000 byte.

Konfigurasikan opsi lain

Anda dapat mengonfigurasi opsi lain dalam metode WithUrl (withUrl di JavaScript) pada HubConnectionBuilder atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder di klien Java.

Opsi Nilai standar Deskripsi
AccessTokenProvider null Fungsi yang mengembalikan nilai string, yang digunakan sebagai token autentikasi Bearer dalam permintaan HTTP.
SkipNegotiation false Atur opsi ini ke true untuk melewati langkah negosiasi.

Catatan: Opsi ini hanya tersedia ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan tidak dapat diaktifkan saat menggunakan layanan Azure SignalR.
ClientCertificates Kosong Kumpulan sertifikat Keamanan Lapisan Transportasi (TLS) untuk dikirim untuk mengautentikasi permintaan.
Cookies Kosong Kumpulan cookie HTTP untuk dikirim dengan setiap permintaan HTTP.
Credentials Kosong Kredensial yang dikirim dengan setiap permintaan HTTP.
CloseTimeout 5 detik Jumlah maksimum waktu klien menunggu setelah menutup server untuk mengakui permintaan tutup. Jika server tidak mengakui penutupan dalam waktu ini, klien akan terputus.

Catatan: Pengaturan ini hanya tersedia untuk WebSocket.
Headers Kosong Peta header HTTP lainnya untuk dikirim dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Anda dapat mengubah pengaturan pada nilai default tersebut dan mengembalikannya, atau mengembalikan instans baru HttpMessageHandler .

Catatan:
- Ketika Anda mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan. Jika tidak, opsi yang dikonfigurasi (seperti Cookie dan Header) tidak berlaku untuk handler baru.
- Pengaturan ini tidak digunakan untuk koneksi WebSocket.
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. Opsi ini memungkinkan penggunaan Windows authentication.
WebSocketConfiguration null Delegasi yang dapat digunakan untuk mengonfigurasi lebih banyak opsi WebSocket. Menerima instans ClientWebSocketOptions yang dapat digunakan untuk mengonfigurasi opsi.
ApplicationMaxBufferSize 1 MB Jumlah maksimum byte yang diterima dari server yang di-buffer oleh 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 disimpan dalam buffer klien sebelum terjadi tekanan balik. Meningkatkan nilai ini memungkinkan klien untuk melakukan buffer pesan yang lebih besar lebih cepat tanpa menunggu hambatan aliran data, namun demikian dapat meningkatkan konsumsi memori.

Di klien .NET, opsi ini dapat dimodifikasi dalam 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();

Opsi serialisasi JSON/MessagePack

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

Serialisasi JSON dapat dikonfigurasi di server menggunakan metode ekstensi AddJsonProtocol, yang dapat ditambahkan setelah AddSignalR dalam Startup.ConfigureServices metode Anda. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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 agar menggunakan nama properti "PascalCase" daripada nama "camelCase" yang merupakan default, gunakan kode berikut di :

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

Nota

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

Opsi serialisasi MessagePack

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

Nota

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

Konfigurasi pilihan server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Bawaan 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 pengaturan ServerTimeout atau pengaturan serverTimeoutInMilliseconds pada klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 mengganti opsi global yang disediakan di dalam AddSignalR dan dapat dikonfigurasi dengan 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai Bawaan 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 dan di-buffer oleh 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 Bawaan 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 Bawaan 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 mengandung opsi konfigurasi penyusun, serta pada HubConnection sendiri.

Mengonfigurasi pengelogan

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

Nota

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

Nota

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 fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan melalui delegasi 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 HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan RxJavaSingle<String>. 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 aktif

Opsi tambahan untuk mengonfigurasi timeout dan perilaku keep-alive tersedia pada objek HubConnection itu sendiri.

Opsi Nilai standar 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 Batas waktu untuk proses awal jabat tangan server. 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 standar 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 cookie HTTP untuk 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 Daftar header HTTP tambahan yang akan dikirimkan dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. 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 Cookie 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 HttpHubConnectionBuilder yang 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

Opsi serialisasi JSON/MessagePack

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

Serialisasi JSON dapat dikonfigurasi di server menggunakan metode ekstensi AddJsonProtocol, yang dapat ditambahkan setelah AddSignalR dalam Startup.ConfigureServices metode Anda. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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 agar menggunakan nama properti "PascalCase" daripada nama "camelCase" yang merupakan default, gunakan kode berikut di :

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

Nota

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

Opsi serialisasi MessagePack

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

Nota

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

Konfigurasi pilihan server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Bawaan Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin diperlukan waktu lebih lama dari interval batas waktu ini agar klien dianggap terputus, bergantung pada cara penerapannya. 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 pengaturan ServerTimeout atau pengaturan serverTimeoutInMilliseconds pada klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 mengganti opsi global yang disediakan di dalam AddSignalR dan dapat dikonfigurasi dengan 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai Bawaan 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 dan di-buffer oleh 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 Bawaan 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 Bawaan 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 mengandung opsi konfigurasi penyusun, serta pada HubConnection sendiri.

Mengonfigurasi pengelogan

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

Nota

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

Nota

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 fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan melalui delegasi 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 HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan RxJavaSingle<String>. 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 aktif

Opsi tambahan untuk mengonfigurasi timeout dan perilaku keep-alive tersedia pada objek HubConnection itu sendiri.

Opsi Nilai standar 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 Batas waktu untuk proses awal jabat tangan server. 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 waktu yang ditetapkan di server, server akan menganggap 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 standar 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 cookie HTTP untuk 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 Daftar header HTTP tambahan yang akan dikirimkan dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. 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 Cookie 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 HttpHubConnectionBuilder yang 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

Opsi serialisasi JSON/MessagePack

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

Serialisasi JSON dapat dikonfigurasi di server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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();

Nota

Tidak dimungkinkan untuk mengonfigurasi serialisasi JSON 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 untuk panggilan AddMessagePackProtocol. Lihat MessagePack di SignalR untuk detail selengkapnya.

Nota

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

Konfigurasi pilihan server

Tabel berikut menjelaskan opsi untuk mengonfigurasi SignalR hub.

Opsi Nilai Bawaan Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin diperlukan waktu lebih lama dari interval batas waktu ini agar klien dianggap terputus, bergantung pada cara penerapannya. 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 pengaturan ServerTimeout atau pengaturan serverTimeoutInMilliseconds pada klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 yang masuk ke hub. 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 mengganti opsi global yang disediakan di dalam AddSignalR dan dapat dikonfigurasi dengan 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai Bawaan 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 men-buffer pesan yang lebih besar lebih cepat tanpa menunggu tekanan balik, 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 Bawaan 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 Bawaan 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 mengandung opsi konfigurasi penyusun, serta pada HubConnection sendiri.

Mengonfigurasi pengelogan

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

Nota

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 memberikan LogLevel nilai, Anda juga dapat memberikan string nilai berupa nama tingkatan 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
info atauinformation LogLevel.Information
warn atauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

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 fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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();

Nota

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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan melalui delegasi 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 HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan RxJavaSingle<String>. 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 aktif

Opsi tambahan untuk mengonfigurasi timeout dan perilaku keep-alive tersedia pada objek HubConnection itu sendiri.

Opsi Nilai standar 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 Batas waktu untuk proses awal jabat tangan server. 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 waktu yang ditetapkan di server, server akan menganggap 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 standar 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 cookie HTTP untuk 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 Daftar header HTTP tambahan yang akan dikirimkan dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. 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 Cookie 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 HttpHubConnectionBuilder yang 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

Opsi serialisasi JSON/MessagePack

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

Serialisasi JSON dapat dikonfigurasi di server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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();

Nota

Tidak dimungkinkan untuk mengonfigurasi serialisasi JSON 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 untuk panggilan AddMessagePackProtocol. Lihat MessagePack di SignalR untuk detail selengkapnya.

Nota

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

Konfigurasi pilihan server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Bawaan Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin diperlukan waktu lebih lama dari interval batas waktu ini agar klien dianggap terputus, bergantung pada cara penerapannya. 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 pengaturan ServerTimeout atau pengaturan serverTimeoutInMilliseconds pada klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 yang masuk ke hub. 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 mengganti opsi global yang disediakan di dalam AddSignalR dan dapat dikonfigurasi dengan 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai Bawaan 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 men-buffer pesan yang lebih besar lebih cepat tanpa menunggu tekanan balik, 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 Bawaan 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 Bawaan 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 mengandung opsi konfigurasi penyusun, serta pada HubConnection sendiri.

Mengonfigurasi pengelogan

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

Nota

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 memberikan LogLevel nilai, Anda juga dapat memberikan string nilai berupa nama tingkatan 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
info atauinformation LogLevel.Information
warn atauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

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 fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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();

Nota

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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan melalui delegasi 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 HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan RxJavaSingle<String>. 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 aktif

Opsi tambahan untuk mengonfigurasi timeout dan perilaku keep-alive tersedia pada objek HubConnection itu sendiri.

Opsi Nilai standar 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 Batas waktu untuk proses awal jabat tangan server. 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 waktu yang ditetapkan di server, server akan menganggap 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 standar 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 cookie HTTP untuk 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 Daftar header HTTP tambahan yang akan dikirimkan dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. 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 Cookie 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 HttpHubConnectionBuilder yang 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

Opsi serialisasi JSON/MessagePack

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

Serialisasi JSON dapat dikonfigurasi di server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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();

Nota

Tidak dimungkinkan untuk mengonfigurasi serialisasi JSON 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 untuk panggilan AddMessagePackProtocol. Lihat MessagePack di SignalR untuk detail selengkapnya.

Nota

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

Konfigurasi pilihan server

Tabel berikut menjelaskan opsi untuk mengonfigurasi SignalR hub.

Opsi Nilai Bawaan Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin diperlukan waktu lebih lama dari interval batas waktu ini agar klien dianggap terputus, bergantung pada cara penerapannya. 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 pengaturan ServerTimeout atau pengaturan serverTimeoutInMilliseconds pada klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 yang masuk ke hub. 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.

Nota

MaximumParallelInvocationsPerClient tidak berlaku untuk pemanggilan hub streaming. Pemanggilan streaming umumnya berlangsung lama dan dapat berjalan secara bersamaan. Gunakan filter hub untuk memberlakukan batas konkurensi streaming per koneksi.

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 mengganti opsi global yang disediakan di dalam AddSignalR dan dapat dikonfigurasi dengan 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai Bawaan 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 men-buffer pesan yang lebih besar lebih cepat tanpa menunggu tekanan balik, 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 Bawaan 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 Bawaan 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 mengandung opsi konfigurasi penyusun, serta pada HubConnection sendiri.

Mengonfigurasi pengelogan

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

Nota

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 memberikan LogLevel nilai, Anda juga dapat memberikan string nilai berupa nama tingkatan 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
info atauinformation LogLevel.Information
warn atauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

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 fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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();

Nota

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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan melalui delegasi 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 HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan RxJavaSingle<String>. 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 aktif

Opsi tambahan untuk mengonfigurasi timeout dan perilaku keep-alive tersedia pada objek HubConnection itu sendiri.

Opsi Nilai standar 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 Batas waktu untuk proses awal jabat tangan server. 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 waktu yang ditetapkan di server, server akan menganggap 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 standar 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 cookie HTTP untuk 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 Daftar header HTTP tambahan yang akan dikirimkan dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. 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 Cookie 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 HttpHubConnectionBuilder yang 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

Opsi serialisasi JSON/MessagePack

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

Serialisasi JSON dapat dikonfigurasi di server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Program.cs. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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();

Nota

Tidak dimungkinkan untuk mengonfigurasi serialisasi JSON 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 untuk panggilan AddMessagePackProtocol. Lihat MessagePack di SignalR untuk detail selengkapnya.

Nota

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

Konfigurasi pilihan server

Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:

Opsi Nilai Bawaan Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin diperlukan waktu lebih lama dari interval batas waktu ini agar klien dianggap terputus, bergantung pada cara penerapannya. 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 pengaturan ServerTimeout atau pengaturan serverTimeoutInMilliseconds pada klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 yang masuk ke hub. 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.

Nota

MaximumParallelInvocationsPerClient tidak berlaku untuk pemanggilan hub streaming. Pemanggilan streaming umumnya berlangsung lama dan dapat berjalan secara bersamaan. Gunakan filter hub untuk memberlakukan batas konkurensi streaming per koneksi.

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 mengganti opsi global yang disediakan di dalam AddSignalR dan dapat dikonfigurasi dengan 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai Bawaan 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 tidak benar 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 Bawaan 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 Bawaan 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 mengandung opsi konfigurasi penyusun, serta pada HubConnection sendiri.

Mengonfigurasi pengelogan

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

Nota

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 memberikan LogLevel nilai, Anda juga dapat memberikan string nilai berupa nama tingkatan 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
info atauinformation LogLevel.Information
warn atauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

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 fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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();

Nota

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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan melalui delegasi 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 HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan RxJavaSingle<String>. 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 aktif

Opsi tambahan untuk mengonfigurasi timeout dan perilaku keep-alive tersedia pada objek HubConnection itu sendiri.

Opsi Nilai standar 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 Batas waktu untuk proses awal jabat tangan server. 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 waktu yang ditetapkan di server, server akan menganggap 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 standar 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 cookie HTTP untuk 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 Daftar header HTTP tambahan yang akan dikirimkan dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. 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 Cookie 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 oleh 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 disimpan dalam buffer klien sebelum terjadi tekanan balik. Meningkatkan nilai ini memungkinkan klien untuk melakukan buffer pesan yang lebih besar lebih cepat tanpa menunggu hambatan aliran data, namun demikian 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 HttpHubConnectionBuilder yang 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

Opsi serialisasi JSON/MessagePack

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

Serialisasi JSON dapat dikonfigurasi di server menggunakan AddJsonProtocol metode ekstensi. AddJsonProtocol dapat ditambahkan setelah AddSignalR di Startup.ConfigureServices. Metode AddJsonProtocol membutuhkan delegat yang menerima objek options. 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();

Nota

Tidak dimungkinkan untuk mengonfigurasi serialisasi JSON 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 untuk panggilan AddMessagePackProtocol. Lihat MessagePack di SignalR untuk detail selengkapnya.

Nota

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

Konfigurasi pilihan server

Tabel berikut menjelaskan opsi untuk mengonfigurasi SignalR hub.

Opsi Nilai Bawaan Deskripsi
ClientTimeoutInterval 30 detik Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin diperlukan waktu lebih lama dari interval batas waktu ini agar klien dianggap terputus, bergantung pada cara penerapannya. 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 pengaturan ServerTimeout atau pengaturan serverTimeoutInMilliseconds pada klien. Nilai yang direkomendasikan ServerTimeout atau serverTimeoutInMilliseconds adalah dua kali lipat dari nilai KeepAliveInterval.
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 yang masuk ke hub. 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. Batas ini tidak berlaku untuk pemanggilan hub streaming.
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 mengganti opsi global yang disediakan di dalam AddSignalR dan dapat dikonfigurasi dengan 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 tingkat lanjut ASP.NET CoreSignalR.

Opsi Nilai Bawaan 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 tidak benar 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 Bawaan 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 Bawaan 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 mengandung opsi konfigurasi penyusun, serta pada HubConnection sendiri.

Mengonfigurasi pengelogan

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

Nota

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 memberikan LogLevel nilai, Anda juga dapat memberikan string nilai berupa nama tingkatan 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
info atauinformation LogLevel.Information
warn atauwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

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 fungsi panggilan WithUrl (withUrl di JavaScript). Operasi bitwise-OR pada nilai HttpTransportType dapat digunakan untuk membatasi klien agar hanya menggunakan transport yang ditentukan. Semua transportasi diaktifkan secara default.

Misalnya, untuk menonaktifkan transportasi Server-Sent Events, 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();

Nota

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 Server-Sent permintaan Peristiwa dan WebSocket). Dalam kasus ini, token akses disediakan sebagai nilai access_tokenstring kueri .

Di klien .NET, opsi AccessTokenProvider dapat ditentukan melalui delegasi 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 HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan RxJavaSingle<String>. 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 aktif

Opsi tambahan untuk mengonfigurasi timeout dan perilaku keep-alive tersedia pada objek HubConnection itu sendiri.

Opsi Nilai standar 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 Batas waktu untuk proses awal jabat tangan server. 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 waktu yang ditetapkan di server, server akan menganggap 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 standar 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 cookie HTTP untuk 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 Daftar header HTTP tambahan yang akan dikirimkan dengan setiap permintaan HTTP.
HttpMessageHandlerFactory null Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti HttpMessageHandler yang digunakan untuk mengirim permintaan HTTP. 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 Cookie 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 oleh 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 disimpan dalam buffer klien sebelum terjadi tekanan balik. Meningkatkan nilai ini memungkinkan klien untuk melakukan buffer pesan yang lebih besar lebih cepat tanpa menunggu hambatan aliran data, namun demikian 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 HttpHubConnectionBuilder yang 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