Konfigurasi ASP.NET Core SignalR
Artikel ini membahas konfigurasi ASP.NET Core SignalR .
Untuk Blazorpanduan, yang menambahkan atau menggantikan panduan dalam artikel ini, lihat panduan ASP.NET CoreBlazorSignalR.SignalR
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 ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.Json
JsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.
Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Program.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi 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 ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ClientTimeoutInterval |
30 detik | Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval . |
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
StreamBufferCapacity |
10 |
Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming. |
MaximumReceiveMessageSize |
32 KB | Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS). |
MaximumParallelInvocationsPerClient |
1 | Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre. |
DisableImplicitFromServicesParameters |
false |
Argumen metode hub diselesaikan dari DI jika memungkinkan. |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
64 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
TransportMaxBufferSize |
64 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
MinimumProtocolVersion |
0 | Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru. |
CloseOnAuthenticationExpiration |
salah | Atur opsi ini untuk mengaktifkan pelacakan kedaluwarsa autentikasi, yang akan menutup koneksi saat token kedaluwarsa. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Alih-alih LogLevel
nilai, Anda juga dapat memberikan nilai yang string
mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel
konstanta.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging
mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.
String | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info atau information |
LogLevel.Information |
warn atau warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Dalam versi WebSocket klien Java ini adalah satu-satunya transportasi yang tersedia.
Di klien Java, transportasi dipilih dengan withTransport
metode pada HttpHubConnectionBuilder
. Klien Java default menggunakan transportasi WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Catatan
Klien SignalR Java belum mendukung fallback transportasi.
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup:
Opsi | Nilai default | Deskripsi |
---|---|---|
WithServerTimeout |
30 detik (30.000 milidetik) | Batas waktu untuk aktivitas server dan diatur langsung pada HubConnectionBuilder. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai interval tetap hidup (WithKeepAliveInterval ) server untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal dan tersedia pada objek itu HubConnection sendiri. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
WithKeepAliveInterval |
15 detik | Menentukan interval di mana klien mengirim pesan ping dan diatur langsung pada HubConnectionBuilder. Pengaturan ini memungkinkan server mendeteksi pemutusan sambungan keras, seperti ketika klien mencabut sambungan komputernya dari jaringan. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Contoh berikut menunjukkan nilai yang menggandakan nilai default:
var builder = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.WithServerTimeout(TimeSpan.FromSeconds(60))
.WithKeepAliveInterval(TimeSpan.FromSeconds(30))
.Build();
builder.On<string, string>("ReceiveMessage", (user, message) => ...
await builder.StartAsync();
Mengonfigurasi koneksi ulang stateful
SignalR koneksi ulang stateful mengurangi waktu henti klien yang dirasakan yang memiliki pemutusan sementara dalam koneksi jaringan mereka, seperti saat beralih koneksi jaringan atau kehilangan akses sementara yang singkat.
Koneksi ulang stateful mencapai ini dengan:
- Sementara data buffering di server dan klien.
- Mengakui pesan yang diterima (ACK-ing) oleh server dan klien.
- Mengenali kapan koneksi aktif dan memutar ulang pesan yang mungkin telah dikirim saat koneksi tidak berfungsi.
Koneksi ulang stateful tersedia di ASP.NET Core 8.0 dan yang lebih baru.
Ikut serta untuk menyambungkan kembali stateful di titik akhir hub server dan klien:
Perbarui konfigurasi titik akhir hub server 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 :Opsi
StatefulReconnectBufferSize
diatur secara global:builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
Opsi
StatefulReconnectBufferSize
yang diatur untuk hub tertentu:builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
Opsi
StatefulReconnectBufferSize
ini bersifat opsional dengan default 100.000 byte.Perbarui kode klien 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();
Opsi
bufferSize
ini bersifat opsional dengan default 100.000 byte.Perbarui kode klien .NET untuk mengaktifkan
WithStatefulReconnect
opsi:var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();
Opsi
StatefulReconnectBufferSize
ini bersifat opsional dengan default 100.000 byte.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 klien sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan klien untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
TransportMaxBufferSize |
1 MB | Jumlah maksimum byte yang dikirim oleh aplikasi pengguna yang di-buffer klien sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan klien untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
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, yang dapat ditambahkan setelah AddSignalR dalam metode Anda Startup.ConfigureServices
. Metode ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerSettings adalah objek Json.NET JsonSerializerSettings
yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi Json.NET.
Misalnya, untuk mengonfigurasi serializer untuk menggunakan nama properti "PascalCase", daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi JSON di klien JavaScript saat ini.
Opsi serialisasi MessagePack
Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
32 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
TransportMaxBufferSize |
32 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server. Meningkatkan nilai ini memungkinkan server mengirim pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection
sendiri:
Opsi | Nilai default | Deskripsi |
---|---|---|
ServerTimeout |
30 detik (30.000 milidetik) | Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
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, yang dapat ditambahkan setelah AddSignalR dalam metode Anda Startup.ConfigureServices
. Metode ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerSettings adalah objek Json.NET JsonSerializerSettings
yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi Json.NET.
Misalnya, untuk mengonfigurasi serializer untuk menggunakan nama properti "PascalCase", daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi JSON di klien JavaScript saat ini.
Opsi serialisasi MessagePack
Serialisasi MessagePack dapat dikonfigurasi dengan memberikan delegasi ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ClientTimeoutInterval |
30 detik | Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval . |
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
32 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
TransportMaxBufferSize |
32 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server. Meningkatkan nilai ini memungkinkan server mengirim pesan yang lebih besar, tetapi dapat berdampak negatif pada konsumsi memori. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Dalam versi WebSocket klien Java ini adalah satu-satunya transportasi yang tersedia.
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection
sendiri:
Opsi | Nilai default | Deskripsi |
---|---|---|
ServerTimeout |
30 detik (30.000 milidetik) | Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
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 ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.Json
JsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.
Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi 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 ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ClientTimeoutInterval |
30 detik | Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval . |
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
StreamBufferCapacity |
10 |
Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming. |
MaximumReceiveMessageSize |
32 KB | Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS). |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
32 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar dengan lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
TransportMaxBufferSize |
32 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Alih-alih LogLevel
nilai, Anda juga dapat memberikan nilai yang string
mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel
konstanta.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging
mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.
String | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info atau information |
LogLevel.Information |
warn atau warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Dalam versi WebSocket klien Java ini adalah satu-satunya transportasi yang tersedia.
Di klien Java, transportasi dipilih dengan withTransport
metode pada HttpHubConnectionBuilder
. Klien Java default menggunakan transportasi WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Catatan
Klien SignalR Java belum mendukung fallback transportasi.
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection
sendiri:
Opsi | Nilai default | Deskripsi |
---|---|---|
ServerTimeout |
30 detik (30.000 milidetik) | Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
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 ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.Json
JsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.
Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi 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 ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ClientTimeoutInterval |
30 detik | Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval . |
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
StreamBufferCapacity |
10 |
Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming. |
MaximumReceiveMessageSize |
32 KB | Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS). |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
32 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar dengan lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
TransportMaxBufferSize |
32 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
MinimumProtocolVersion |
0 | Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Alih-alih LogLevel
nilai, Anda juga dapat memberikan nilai yang string
mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel
konstanta.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging
mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.
String | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info atau information |
LogLevel.Information |
warn atau warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Dalam versi WebSocket klien Java ini adalah satu-satunya transportasi yang tersedia.
Di klien Java, transportasi dipilih dengan withTransport
metode pada HttpHubConnectionBuilder
. Klien Java default menggunakan transportasi WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Catatan
Klien SignalR Java belum mendukung fallback transportasi.
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection
sendiri:
Opsi | Nilai default | Deskripsi |
---|---|---|
ServerTimeout |
30 detik (30.000 milidetik) | Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
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 ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.Json
JsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.
Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi 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 ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ClientTimeoutInterval |
30 detik | Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval . |
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
StreamBufferCapacity |
10 |
Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming. |
MaximumReceiveMessageSize |
32 KB | Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS). |
MaximumParallelInvocationsPerClient |
1 | Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre. |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
32 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar dengan lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
TransportMaxBufferSize |
32 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
MinimumProtocolVersion |
0 | Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Alih-alih LogLevel
nilai, Anda juga dapat memberikan nilai yang string
mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel
konstanta.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging
mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.
String | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info atau information |
LogLevel.Information |
warn atau warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Dalam versi WebSocket klien Java ini adalah satu-satunya transportasi yang tersedia.
Di klien Java, transportasi dipilih dengan withTransport
metode pada HttpHubConnectionBuilder
. Klien Java default menggunakan transportasi WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Catatan
Klien SignalR Java belum mendukung fallback transportasi.
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection
sendiri:
Opsi | Nilai default | Deskripsi |
---|---|---|
ServerTimeout |
30 detik (30.000 milidetik) | Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
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 ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.Json
JsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.
Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Program.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi 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 ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ClientTimeoutInterval |
30 detik | Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval . |
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
StreamBufferCapacity |
10 |
Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming. |
MaximumReceiveMessageSize |
32 KB | Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS). |
MaximumParallelInvocationsPerClient |
1 | Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre. |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
64 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
TransportMaxBufferSize |
64 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
MinimumProtocolVersion |
0 | Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru. |
CloseOnAuthenticationExpiration |
salah | Atur opsi ini untuk mengaktifkan pelacakan kedaluwarsa autentikasi yang akan menutup koneksi saat token kedaluwarsa. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Alih-alih LogLevel
nilai, Anda juga dapat memberikan nilai yang string
mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel
konstanta.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging
mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.
String | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info atau information |
LogLevel.Information |
warn atau warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Dalam versi WebSocket klien Java ini adalah satu-satunya transportasi yang tersedia.
Di klien Java, transportasi dipilih dengan withTransport
metode pada HttpHubConnectionBuilder
. Klien Java default menggunakan transportasi WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Catatan
Klien SignalR Java belum mendukung fallback transportasi.
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection
sendiri:
Opsi | Nilai default | Deskripsi |
---|---|---|
ServerTimeout |
30 detik (30.000 milidetik) | Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 klien sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan klien untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
TransportMaxBufferSize |
1 MB | Jumlah maksimum byte yang dikirim oleh aplikasi pengguna yang di-buffer klien sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan klien untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
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 ini AddJsonProtocol
mengambil delegasi yang menerima options
objek. Properti pada objek tersebut PayloadSerializerOptions adalah System.Text.Json
JsonSerializerOptions objek yang dapat digunakan untuk mengonfigurasi serialisasi argumen dan mengembalikan nilai. Untuk informasi selengkapnya, lihat dokumentasi System.Text.Json.
Misalnya, untuk mengonfigurasi serializer agar tidak mengubah casing nama properti, daripada nama kasus unta default, gunakan kode berikut di Program.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
Di klien .NET, metode ekstensi yang sama AddJsonProtocol
ada di HubConnectionBuilder. Namespace Microsoft.Extensions.DependencyInjection
harus diimpor untuk menyelesaikan metode ekstensi:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Catatan
Tidak dimungkinkan untuk mengonfigurasi 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 ke AddMessagePackProtocol panggilan. Lihat MessagePack di SignalR untuk detail selengkapnya.
Catatan
Tidak dimungkinkan untuk mengonfigurasi serialisasi MessagePack di klien JavaScript saat ini.
Mengonfigurasi opsi server
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi SignalR hub:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ClientTimeoutInterval |
30 detik | Server menganggap klien terputus jika belum menerima pesan (termasuk tetap hidup) dalam interval ini. Mungkin perlu waktu lebih lama dari interval batas waktu ini agar klien ditandai terputus karena bagaimana hal ini diterapkan. Nilai yang disarankan adalah dua kali lipat nilainya KeepAliveInterval . |
HandshakeTimeout |
15 detik | Jika klien tidak mengirim pesan jabat tangan awal dalam interval waktu ini, koneksi ditutup. Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Jika server belum mengirim pesan dalam interval ini, pesan ping dikirim secara otomatis untuk menjaga koneksi tetap terbuka. Saat mengubah KeepAliveInterval , ubah ServerTimeout pengaturan atau serverTimeoutInMilliseconds pada klien. Nilai atau yang direkomendasikan ServerTimeout adalah dua kali lipat nilainyaKeepAliveInterval .serverTimeoutInMilliseconds |
SupportedProtocols |
Semua protokol yang terinstal | Protokol yang didukung oleh hub ini. Secara default, semua protokol yang terdaftar di server diizinkan. Protokol dapat dihapus dari daftar ini untuk menonaktifkan protokol tertentu untuk hub individual. |
EnableDetailedErrors |
false |
Jika true , pesan pengecualian terperinci dikembalikan ke klien saat pengecualian dilemparkan dalam metode Hub. Defaultnya adalah false karena pesan pengecualian ini dapat berisi informasi sensitif. |
StreamBufferCapacity |
10 |
Jumlah maksimum item yang dapat di-buffer untuk stream pengunggahan klien. Jika batas ini tercapai, pemrosesan pemanggilan diblokir hingga server memproses item streaming. |
MaximumReceiveMessageSize |
32 KB | Ukuran maksimum satu pesan hub masuk. Meningkatkan nilai dapat meningkatkan risiko serangan Denial of service (DoS). |
MaximumParallelInvocationsPerClient |
1 | Jumlah maksimum metode hub yang dapat dipanggil setiap klien secara paralel sebelum mengantre. |
DisableImplicitFromServicesParameters |
false |
Argumen metode hub akan diselesaikan dari DI jika memungkinkan. |
Opsi dapat dikonfigurasi untuk semua hub dengan menyediakan opsi yang mendelegasikan ke AddSignalR
panggilan di Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Opsi untuk satu hub mengambil alih opsi global yang disediakan dan dapat dikonfigurasi AddSignalR
menggunakan AddHubOptions:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opsi konfigurasi HTTP tingkat lanjut
Gunakan HttpConnectionDispatcherOptions
untuk mengonfigurasi pengaturan tingkat lanjut yang terkait dengan transportasi dan manajemen buffer memori. Opsi ini dikonfigurasi dengan meneruskan delegasi ke MapHub dalam Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
Tabel berikut ini menjelaskan opsi untuk mengonfigurasi opsi HTTP lanjutan ASP.NET Core SignalR:
Opsi | Nilai Default | Deskripsi |
---|---|---|
ApplicationMaxBufferSize |
64 KB | Jumlah maksimum byte yang diterima dari klien yang di-buffer server sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan server untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
TransportMaxBufferSize |
64 KB | Jumlah maksimum byte yang dikirim oleh aplikasi yang di-buffer server sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan server untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
AuthorizationData |
Data yang dikumpulkan secara otomatis dari Authorize atribut yang diterapkan ke kelas Hub. |
Daftar IAuthorizeData objek yang digunakan untuk menentukan apakah klien berwenang untuk terhubung ke hub. |
Transports |
Semua Transportasi diaktifkan. | Bit menandai enum HttpTransportType nilai yang dapat membatasi transportasi yang dapat digunakan klien untuk menyambungkan. |
LongPolling |
Lihat bawah. | Opsi tambahan khusus untuk transportasi Long Polling. |
WebSockets |
Lihat bawah. | Opsi tambahan khusus untuk transportasi WebSockets. |
MinimumProtocolVersion |
0 | Tentukan versi minimum protokol negosiasi. Ini digunakan untuk membatasi klien ke versi yang lebih baru. |
CloseOnAuthenticationExpiration |
salah | Atur opsi ini untuk mengaktifkan pelacakan kedaluwarsa autentikasi yang akan menutup koneksi saat token kedaluwarsa. |
Transportasi Long Polling memiliki opsi tambahan yang dapat dikonfigurasi menggunakan LongPolling
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
PollTimeout |
90 detik | Jumlah maksimum waktu server menunggu pesan dikirim ke klien sebelum mengakhiri satu permintaan polling. Mengurangi nilai ini menyebabkan klien lebih sering mengeluarkan permintaan polling baru. |
Transportasi WebSocket memiliki opsi tambahan yang dapat dikonfigurasi menggunakan WebSockets
properti :
Opsi | Nilai Default | Deskripsi |
---|---|---|
CloseTimeout |
5 detik | Setelah server ditutup, jika klien gagal menutup dalam interval waktu ini, koneksi dihentikan. |
SubProtocolSelector |
null |
Delegasi yang dapat digunakan untuk mengatur Sec-WebSocket-Protocol header ke nilai kustom. Delegasi menerima nilai yang diminta oleh klien sebagai input dan diharapkan mengembalikan nilai yang diinginkan. |
Mengonfigurasi opsi klien
Opsi klien dapat dikonfigurasi pada HubConnectionBuilder
jenis (tersedia di klien .NET dan JavaScript). Ini juga tersedia di klien Java, tetapi HttpHubConnectionBuilder
subkelas adalah apa yang berisi opsi konfigurasi penyusun, serta pada dirinya HubConnection
sendiri.
Mengonfigurasi pengelogan
Pengelogan dikonfigurasi di Klien .NET menggunakan ConfigureLogging
metode . Penyedia dan filter pengelogan dapat didaftarkan dengan cara yang sama seperti yang ada di server. Lihat dokumentasi Pengelogan di ASP.NET Core untuk informasi selengkapnya.
Catatan
Untuk mendaftarkan penyedia Pengelogan, Anda harus menginstal paket yang diperlukan. Lihat bagian Penyedia pengelogan bawaan dari dokumen untuk daftar lengkap.
Misalnya, untuk mengaktifkan pengelogan Konsol, instal Microsoft.Extensions.Logging.Console
paket NuGet. AddConsole
Panggil metode ekstensi:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
Di klien JavaScript, ada metode serupa configureLogging
. Berikan nilai yang LogLevel
menunjukkan tingkat minimum pesan log yang akan dihasilkan. Log ditulis ke jendela konsol browser.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Alih-alih LogLevel
nilai, Anda juga dapat memberikan nilai yang string
mewakili nama tingkat log. Ini berguna saat mengonfigurasi pengelogan SignalR di lingkungan tempat Anda tidak memiliki akses ke LogLevel
konstanta.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
Tabel berikut mencantumkan tingkat log yang tersedia. Nilai yang Anda berikan untuk configureLogging
mengatur tingkat log minimum yang akan dicatat. Pesan yang dicatat pada tingkat ini, atau tingkat yang tercantum setelahnya dalam tabel, akan dicatat.
String | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info atau information |
LogLevel.Information |
warn atau warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Catatan
Untuk menonaktifkan pengelogan sepenuhnya, tentukan signalR.LogLevel.None
dalam configureLogging
metode .
Untuk informasi selengkapnya tentang pengelogan, lihat SignalR dokumentasi Diagnostik.
Klien SignalR Java menggunakan pustaka SLF4J untuk pengelogan. Ini adalah API pengelogan tingkat tinggi yang memungkinkan pengguna pustaka untuk memilih implementasi pengelogan spesifik mereka sendiri dengan membawa dependensi pengelogan tertentu. Cuplikan kode berikut menunjukkan cara menggunakan java.util.logging
dengan SignalR klien Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Jika Anda tidak mengonfigurasi pengelogan dalam dependensi Anda, SLF4J memuat pencatat tanpa operasi default dengan pesan peringatan berikut:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Ini dapat diabaikan dengan aman.
Mengonfigurasi transportasi yang diizinkan
Transportasi yang digunakan oleh SignalR dapat dikonfigurasi dalam WithUrl
panggilan (withUrl
di JavaScript). Bitwise-OR dari nilai HttpTransportType
dapat digunakan untuk membatasi klien untuk hanya menggunakan transportasi yang ditentukan. Semua transportasi diaktifkan secara default.
Misalnya, untuk menonaktifkan transportasi Peristiwa yang Dikirim Server, tetapi izinkan WebSocket dan koneksi Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
Di klien JavaScript, transportasi dikonfigurasi dengan mengatur transport
bidang pada objek opsi yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Dalam versi WebSocket klien Java ini adalah satu-satunya transportasi yang tersedia.
Di klien Java, transportasi dipilih dengan withTransport
metode pada HttpHubConnectionBuilder
. Klien Java default menggunakan transportasi WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Catatan
Klien SignalR Java belum mendukung fallback transportasi.
Mengonfigurasi autentikasi pembawa
Untuk menyediakan data autentikasi bersama dengan SignalR permintaan, gunakan AccessTokenProvider
opsi (accessTokenFactory
di JavaScript) untuk menentukan fungsi yang mengembalikan token akses yang diinginkan. Di Klien .NET, token akses ini diteruskan sebagai token "Autentikasi Pembawa" HTTP (Menggunakan Authorization
header dengan jenis Bearer
). Di klien JavaScript, token akses digunakan sebagai token Pembawa, kecuali dalam beberapa kasus di mana API browser membatasi kemampuan untuk menerapkan header (khususnya, dalam permintaan Peristiwa terkirim Server dan WebSockets). Dalam kasus ini, token akses disediakan sebagai nilai access_token
string kueri .
Di klien .NET, AccessTokenProvider
opsi dapat ditentukan menggunakan delegasi opsi di WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
Di klien JavaScript, token akses dikonfigurasi dengan mengatur accessTokenFactory
bidang pada objek opsi di withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
SignalR Di klien Java, Anda dapat mengonfigurasi token pembawa untuk digunakan untuk autentikasi dengan menyediakan pabrik token akses ke HttpHubConnectionBuilder. Gunakan denganAccessTokenFactory untuk menyediakan String> Tunggal<RxJava. Dengan panggilan ke Single.defer, Anda dapat menulis logika untuk menghasilkan token akses untuk klien Anda.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Mengonfigurasi waktu habis dan opsi tetap hidup
Opsi tambahan untuk mengonfigurasi batas waktu dan perilaku tetap hidup tersedia pada objek itu HubConnection
sendiri:
Opsi | Nilai default | Deskripsi |
---|---|---|
ServerTimeout |
30 detik (30.000 milidetik) | Waktu habis untuk aktivitas server. Jika server belum mengirim pesan dalam interval ini, klien mempertimbangkan server terputus dan memicu Closed peristiwa (onclose di JavaScript). Nilai ini harus cukup besar agar pesan ping dikirim dari server dan diterima oleh klien dalam interval waktu habis. Nilai yang disarankan adalah angka setidaknya dua kali lipat dari nilai server KeepAliveInterval untuk memungkinkan waktu ping tiba. |
HandshakeTimeout |
15 detik | Waktu habis untuk jabat tangan server awal. Jika server tidak mengirim respons jabat tangan dalam interval ini, klien membatalkan jabat tangan dan memicu Closed peristiwa (onclose di JavaScript). Ini adalah pengaturan lanjutan yang hanya boleh dimodifikasi jika kesalahan batas waktu jabat tangan terjadi karena latensi jaringan yang parah. Untuk detail selengkapnya tentang proses jabat tangan, lihat SignalR Spesifikasi Protokol Hub. |
KeepAliveInterval |
15 detik | Menentukan interval saat klien mengirim pesan ping. Mengirim pesan apa pun dari klien mengatur ulang timer ke awal interval. Jika klien belum mengirim pesan dalam ClientTimeoutInterval set di server, server mempertimbangkan klien terputus. |
Di Klien .NET, nilai batas waktu ditentukan sebagai TimeSpan
nilai.
Mengonfigurasi opsi tambahan
Opsi tambahan dapat dikonfigurasi dalam WithUrl
metode (withUrl
dalam JavaScript) pada HubConnectionBuilder
atau pada berbagai API konfigurasi pada HttpHubConnectionBuilder
di klien Java:
Opsi .NET | Nilai default | Deskripsi |
---|---|---|
AccessTokenProvider |
null |
Fungsi yang mengembalikan string yang disediakan sebagai token autentikasi Pembawa dalam permintaan HTTP. |
SkipNegotiation |
false |
Atur ini ke true untuk melewati langkah negosiasi. Hanya didukung ketika transportasi WebSockets adalah satu-satunya transportasi yang diaktifkan. Pengaturan ini tidak dapat diaktifkan saat menggunakan Layanan Azure SignalR . |
ClientCertificates |
Kosong | Kumpulan sertifikat TLS untuk dikirim untuk mengautentikasi permintaan. |
Cookies |
Kosong | Kumpulan 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 | Peta header HTTP tambahan untuk dikirim dengan setiap permintaan HTTP. |
HttpMessageHandlerFactory |
null |
Delegasi yang dapat digunakan untuk mengonfigurasi atau mengganti permintaan HTTP yang HttpMessageHandler digunakan untuk mengirim. Tidak digunakan untuk koneksi WebSocket. Delegasi ini harus mengembalikan nilai non-null, dan menerima nilai default sebagai parameter. Ubah pengaturan pada nilai default tersebut dan kembalikan, atau kembalikan instans baru HttpMessageHandler . Saat mengganti handler, pastikan untuk menyalin pengaturan yang ingin Anda simpan dari handler yang disediakan, jika tidak, opsi yang dikonfigurasi (seperti 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 klien sebelum menerapkan backpressure. Meningkatkan nilai ini memungkinkan klien untuk menerima pesan yang lebih besar lebih cepat tanpa menerapkan backpressure, tetapi dapat meningkatkan konsumsi memori. |
TransportMaxBufferSize |
1 MB | Jumlah maksimum byte yang dikirim oleh aplikasi pengguna yang di-buffer klien sebelum mengamati backpressure. Meningkatkan nilai ini memungkinkan klien untuk buffer pesan yang lebih besar lebih cepat tanpa menunggu backpressure, tetapi dapat meningkatkan konsumsi memori. |
Di Klien .NET, opsi ini dapat dimodifikasi oleh delegasi opsi yang disediakan untuk WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
Di Klien JavaScript, opsi ini dapat disediakan dalam objek JavaScript yang disediakan untuk withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
Di klien Java, opsi ini dapat dikonfigurasi dengan metode pada yang HttpHubConnectionBuilder
dikembalikan dari HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Sumber Daya Tambahan:
ASP.NET Core