本文涵蓋 ASP.NET Core SignalR 配置。
如需 BlazorSignalR 相關指引,若該指引新增或取代本文中的指導,請參閱 ASP.NET Core BlazorSignalR 指導方針。
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以在伺服器上使用 AddJsonProtocol 擴充方法來設定 JSON 序列化。 在AddJsonProtocol中可以在AddSignalR之後新增Startup.ConfigureServices。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerOptions 物件的 屬性是 System.Text.JsonJsonSerializerOptions 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 System.Text.Json 檔。
例如,若要將序列化器設定為不要變更屬性名稱的大小寫,而不是預設的駱駝峰命名法名稱,請在 中使用下列程式碼:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
切換至 Newtonsoft.Json
如果您需要 中Newtonsoft.Json不支援的功能System.Text.Json,請參閱切換至 Newtonsoft.Json。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | 如果用戶端尚未在此間隔內收到訊息(包括 keep-alive),伺服器就會將用戶端視為已中斷連線。 由於實作方式,標記客戶端為斷線可能需要超過此逾時間隔。 建議的值是 KeepAliveInterval 值的兩倍。 |
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
StreamBufferCapacity |
10 |
用戶端上傳數據流可以緩衝處理的項目數目上限。 如果達到此限制,則會封鎖叫用的處理,直到伺服器處理數據流項目為止。 |
MaximumReceiveMessageSize |
32 KB | 單一傳入中樞訊息的大小上限。 增加此值可能會增加 拒絕服務 (DoS) 攻擊的風險。 |
MaximumParallelInvocationsPerClient |
1 | 每個用戶端在佇列之前可以平行呼叫的中樞方法數目上限。 |
DisableImplicitFromServicesParameters |
false |
如果可能,中樞方法的參數會從 DI 中解析。 |
您可以在 AddSignalR 中,透過提供給Program.cs呼叫的選項委派,為所有中心設定選項。
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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();
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
64 KB | 在應用回壓之前,伺服器會緩衝從用戶端接收的最大位元組數目。 增加此值可讓伺服器更快接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
TransportMaxBufferSize |
64 KB | 應用程式在伺服器觀察回壓之前會緩衝處理的位元組數目上限。 增加此值可讓伺服器更快速地緩衝處理較大的訊息,而不需要等候backpressure,但會增加記憶體耗用量。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
MinimumProtocolVersion |
0 | 指定交涉通訊協定的最低版本。 這是用來將用戶端限制為較新版本。 |
CloseOnAuthenticationExpiration |
假的 | 設定此選項以啟用驗證到期追蹤,這會在令牌到期時關閉連線。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
您可以提供LogLevel值,來代表記錄層級名稱,而不使用string值。 當您在無法存取SignalR常數的環境中設定LogLevel記錄時,這非常有用。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
下表列出可用的記錄層級。 提供給 configureLogging 的值設定將要記錄的日誌的 最小層級。 系統會記錄在此層級記錄的訊息, 或數據表中所列的層級。
| 繩子 | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
或information |
LogLevel.Information |
warn
或warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
在此版本的 Java 用戶端 WebSockets 中是唯一可用的傳輸。
在 Java 客戶端中,會使用 withTransport 方法在 HttpHubConnectionBuilder 選取傳輸。 Java 用戶端預設為使用 WebSockets 傳輸。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
備註
SignalR Java 用戶端尚不支援傳輸後援。
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持運作行為的其他選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
WithServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時,並直接在 上 HubConnectionBuilder設定。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器保持運作間隔 (WithKeepAliveInterval) 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器交握的逾時設置可在 HubConnection 物件本身取得。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
WithKeepAliveInterval |
15 秒 | 決定客戶端傳送 Ping 訊息的間隔,並直接在 HubConnectionBuilder 上設定。 此設定可讓伺服器偵測強制中斷連線的情況,例如用戶端拔除其電腦與網路的連線。 從客戶端傳送任何訊息會將定時器重設為間隔的開頭。 如果用戶端尚未在伺服器上的集合中 ClientTimeoutInterval 傳送訊息,伺服器就會將用戶端視為已中斷連線。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
下列範例顯示預設值加倍的值:
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();
設定支援狀態的重新連線
SignalR 狀態保持重連可以減少用戶在網路連線暫時中斷時感受到的停機時間,例如在切換網路連線或短暫失去存取時。
具狀態的重新連線是通過以下方式來實現的:
- 暫時緩衝伺服器和用戶端上的資料。
- 確認伺服器和用戶端都接收到訊息(進行 ACK 確認)。
- 辨識連線何時啟動並重新執行連線關閉時可能已傳送的訊息。
.NET 8 或更新版本提供具狀態的重新連線功能。
請在伺服器中樞端點和用戶端上啟用有狀態的重新連線:
更新伺服器中樞端點組態以啟用
AllowStatefulReconnects選項:app.MapHub<MyHub>("/hubName", options => { options.AllowStatefulReconnects = true; });您也可以全域設定伺服器允許的緩衝區大小上限 (以位元組為單位),或透過
StatefulReconnectBufferSize選項來設定特定中樞:全域設置
StatefulReconnectBufferSize選項:builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);為特定中樞設定的
StatefulReconnectBufferSize選項:builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);StatefulReconnectBufferSize選項是選擇性的,預設為 100,000 個位元組。更新 JavaScript 或 TypeScript 用戶端程式碼以啟用
withStatefulReconnect選項:const builder = new signalR.HubConnectionBuilder() .withUrl("/hubname") .withStatefulReconnect({ bufferSize: 1000 }); // Optional, defaults to 100,000 const connection = builder.build();bufferSize選項是選擇性的,預設為 100,000 個位元組。更新 .NET 用戶端程式碼以啟用
WithStatefulReconnect選項:var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();StatefulReconnectBufferSize選項是選擇性的,預設為 100,000 個位元組。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
ApplicationMaxBufferSize |
1 MB | 用戶端在套用 backpressure 之前,從伺服器接收的最大位元組數。 增加此值可讓用戶端更快接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
TransportMaxBufferSize |
1 MB | 用戶端在觀察反壓之前會緩衝處理的使用者應用程式所傳送的最大位元元組數目。 增加此值可以讓用戶端在不等待反壓控制的情況下,更迅速地緩衝較大的訊息,但可能會增加記憶體的使用量。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 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();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
其他資源
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以使用擴充方法,在伺服器上AddJsonProtocol設定 JSON 串行化,您可以在 方法中AddSignalR新增Startup.ConfigureServices。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerSettings 物件的 屬性是 Json.NET JsonSerializerSettings 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 Json.NET 檔。
例如,若要將序列化器設為使用「PascalCase」屬性名稱,而不是預設的駱駝式大小寫名稱,請在Startup.ConfigureServices中使用以下代碼:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
您可以在 AddSignalR 中,透過提供給Startup.ConfigureServices呼叫的選項委派,為所有中心設定選項。
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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;
});
});
}
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | 伺服器所緩衝的從用戶端接收的最大位元組數。 增加此值可讓伺服器接收較大的訊息,但可能會對記憶體耗用量造成負面影響。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
TransportMaxBufferSize |
32 KB | 應用程式傳送且由伺服器緩衝的最大位元組數。 增加此值可讓伺服器傳送較大的訊息,但可能會對記憶體耗用量造成負面影響。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持連線行為的其他選項可以在HubConnection 物件本身取得。
| 選項 | 預設值 | 說明 |
|---|---|---|
ServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器 KeepAliveInterval 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器握手逾時。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 WithUrl 來修改:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
其他資源
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以使用擴充方法,在伺服器上AddJsonProtocol設定 JSON 串行化,您可以在 方法中AddSignalR新增Startup.ConfigureServices。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerSettings 物件的 屬性是 Json.NET JsonSerializerSettings 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 Json.NET 檔。
例如,若要將序列化器設為使用「PascalCase」屬性名稱,而不是預設的駱駝式大小寫名稱,請在Startup.ConfigureServices中使用以下代碼:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | 如果用戶端尚未在此間隔內收到訊息(包括 keep-alive),伺服器就會將用戶端視為已中斷連線。 由於實作方式,標記客戶端為斷線可能需要超過此逾時間隔。 建議的值是 KeepAliveInterval 值的兩倍。 |
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
您可以在 AddSignalR 中,透過提供給Startup.ConfigureServices呼叫的選項委派,為所有中心設定選項。
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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;
});
});
}
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | 伺服器所緩衝的從用戶端接收的最大位元組數。 增加此值可讓伺服器接收較大的訊息,但可能會對記憶體耗用量造成負面影響。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
TransportMaxBufferSize |
32 KB | 應用程式傳送且由伺服器緩衝的最大位元組數。 增加此值可讓伺服器傳送較大的訊息,但可能會對記憶體耗用量造成負面影響。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
在此版本的 Java 用戶端 WebSockets 中是唯一可用的傳輸。
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持連線行為的其他選項可以在HubConnection 物件本身取得。
| 選項 | 預設值 | 說明 |
|---|---|---|
ServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器 KeepAliveInterval 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器握手逾時。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 決定客戶端傳送 Ping 訊息的間隔。 從客戶端傳送任何訊息會將定時器重設為間隔的開頭。 如果用戶端尚未在伺服器上的集合中 ClientTimeoutInterval 傳送訊息,伺服器就會將用戶端視為已中斷連線。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 WithUrl 來修改:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
其他資源
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以在伺服器上使用 AddJsonProtocol 擴充方法來設定 JSON 序列化。 在AddJsonProtocol中可以在AddSignalR之後新增Startup.ConfigureServices。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerOptions 物件的 屬性是 System.Text.JsonJsonSerializerOptions 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 System.Text.Json 檔。
例如,若要將序列化器設定為不要變更屬性名稱的大小寫,而不是預設的駱駝峰命名法名稱,請在 中使用下列程式碼:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
切換至 Newtonsoft.Json
如果您需要 中Newtonsoft.Json不支援的功能System.Text.Json,請參閱切換至 Newtonsoft.Json。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | 如果用戶端尚未在此間隔內收到訊息(包括 keep-alive),伺服器就會將用戶端視為已中斷連線。 由於實作方式,標記客戶端為斷線可能需要超過此逾時間隔。 建議的值是 KeepAliveInterval 值的兩倍。 |
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
StreamBufferCapacity |
10 |
用戶端上傳數據流可以緩衝處理的項目數目上限。 如果達到此限制,則會封鎖叫用的處理,直到伺服器處理數據流項目為止。 |
MaximumReceiveMessageSize |
32 KB | 單一傳入中樞訊息的大小上限。 增加此值可能會增加 阻斷服務 (DoS) 攻擊的風險。 |
您可以在 AddSignalR 中,透過提供給Startup.ConfigureServices呼叫的選項委派,為所有中心設定選項。
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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;
});
});
}
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | 在應用回壓之前,伺服器會緩衝從用戶端接收的最大位元組數目。 增加此值可讓伺服器更快速地接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
TransportMaxBufferSize |
32 KB | 應用程式在伺服器觀察回壓之前會緩衝處理的位元組數目上限。 增加此值可讓伺服器更快速地緩衝較大的訊息,而不需要等候回壓,但會增加記憶體消耗。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
您可以提供LogLevel值,來代表記錄層級名稱,而不使用string值。 當您在無法存取SignalR常數的環境中設定LogLevel記錄時,這非常有用。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
下表列出可用的記錄層級。 提供給 configureLogging 的值設定將要記錄的日誌的 最小層級。 系統會記錄在此層級記錄的訊息, 或數據表中所列的層級。
| 繩子 | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
或information |
LogLevel.Information |
warn
或warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
在此版本的 Java 用戶端 WebSockets 中是唯一可用的傳輸。
在 Java 客戶端中,會使用 withTransport 方法在 HttpHubConnectionBuilder 選取傳輸。 Java 用戶端預設為使用 WebSockets 傳輸。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
備註
SignalR Java 用戶端尚不支援傳輸後援。
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持連線行為的其他選項可以在HubConnection 物件本身取得。
| 選項 | 預設值 | 說明 |
|---|---|---|
ServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器 KeepAliveInterval 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器握手逾時。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 決定客戶端傳送 Ping 訊息的間隔。 從客戶端傳送任何訊息會將定時器重設為間隔的開頭。 如果用戶端尚未在伺服器上的集合中 ClientTimeoutInterval 傳送訊息,伺服器就會將用戶端視為已中斷連線。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 WithUrl 來修改:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
其他資源
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以在伺服器上使用 AddJsonProtocol 擴充方法來設定 JSON 序列化。 在AddJsonProtocol中可以在AddSignalR之後新增Startup.ConfigureServices。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerOptions 物件的 屬性是 System.Text.JsonJsonSerializerOptions 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 System.Text.Json 檔。
例如,若要將序列化器設定為不要變更屬性名稱的大小寫,而不是預設的駱駝峰命名法名稱,請在 中使用下列程式碼:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
切換至 Newtonsoft.Json
如果您需要 中Newtonsoft.Json不支援的功能System.Text.Json,請參閱切換至 Newtonsoft.Json。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | 如果用戶端尚未在此間隔內收到訊息(包括 keep-alive),伺服器就會將用戶端視為已中斷連線。 由於實作方式,標記客戶端為斷線可能需要超過此逾時間隔。 建議的值是 KeepAliveInterval 值的兩倍。 |
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
StreamBufferCapacity |
10 |
用戶端上傳數據流可以緩衝處理的項目數目上限。 如果達到此限制,則會封鎖叫用的處理,直到伺服器處理數據流項目為止。 |
MaximumReceiveMessageSize |
32 KB | 單一傳入中樞訊息的大小上限。 增加此值可能會增加 阻斷服務 (DoS) 攻擊的風險。 |
您可以在 AddSignalR 中,透過提供給Startup.ConfigureServices呼叫的選項委派,為所有中心設定選項。
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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;
});
});
}
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | 在應用回壓之前,伺服器會緩衝從用戶端接收的最大位元組數目。 增加此值可讓伺服器更快速地接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
TransportMaxBufferSize |
32 KB | 應用程式在伺服器觀察回壓之前會緩衝處理的位元組數目上限。 增加此值可讓伺服器更快速地緩衝較大的訊息,而不需要等候回壓,但會增加記憶體消耗。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
MinimumProtocolVersion |
0 | 指定交涉通訊協定的最低版本。 這是用來將用戶端限制為較新版本。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
您可以提供LogLevel值,來代表記錄層級名稱,而不使用string值。 當您在無法存取SignalR常數的環境中設定LogLevel記錄時,這非常有用。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
下表列出可用的記錄層級。 提供給 configureLogging 的值設定將要記錄的日誌的 最小層級。 系統會記錄在此層級記錄的訊息, 或數據表中所列的層級。
| 繩子 | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
或information |
LogLevel.Information |
warn
或warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
在此版本的 Java 用戶端 WebSockets 中是唯一可用的傳輸。
在 Java 客戶端中,會使用 withTransport 方法在 HttpHubConnectionBuilder 選取傳輸。 Java 用戶端預設為使用 WebSockets 傳輸。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
備註
SignalR Java 用戶端尚不支援傳輸後援。
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持連線行為的其他選項可以在HubConnection 物件本身取得。
| 選項 | 預設值 | 說明 |
|---|---|---|
ServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器 KeepAliveInterval 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器握手逾時。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 決定客戶端傳送 Ping 訊息的間隔。 從客戶端傳送任何訊息會將定時器重設為間隔的開頭。 如果用戶端尚未在伺服器上的集合中 ClientTimeoutInterval 傳送訊息,伺服器就會將用戶端視為已中斷連線。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 WithUrl 來修改:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
其他資源
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以在伺服器上使用 AddJsonProtocol 擴充方法來設定 JSON 序列化。 在AddJsonProtocol中可以在AddSignalR之後新增Startup.ConfigureServices。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerOptions 物件的 屬性是 System.Text.JsonJsonSerializerOptions 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 System.Text.Json 檔。
例如,若要將序列化器設定為不要變更屬性名稱的大小寫,而不是預設的駱駝峰命名法名稱,請在 中使用下列程式碼:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
切換至 Newtonsoft.Json
如果您需要 中Newtonsoft.Json不支援的功能System.Text.Json,請參閱切換至 Newtonsoft.Json。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | 如果用戶端尚未在此間隔內收到訊息(包括 keep-alive),伺服器就會將用戶端視為已中斷連線。 由於實作方式,標記客戶端為斷線可能需要超過此逾時間隔。 建議的值是 KeepAliveInterval 值的兩倍。 |
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
StreamBufferCapacity |
10 |
用戶端上傳數據流可以緩衝處理的項目數目上限。 如果達到此限制,則會封鎖叫用的處理,直到伺服器處理數據流項目為止。 |
MaximumReceiveMessageSize |
32 KB | 單一傳入中樞訊息的大小上限。 增加此值可能會增加 阻斷服務 (DoS) 攻擊的風險。 |
MaximumParallelInvocationsPerClient |
1 | 每個用戶端在佇列之前可以平行呼叫的中樞方法數目上限。 |
您可以在 AddSignalR 中,透過提供給Startup.ConfigureServices呼叫的選項委派,為所有中心設定選項。
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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;
});
});
}
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | 在應用回壓之前,伺服器會緩衝從用戶端接收的最大位元組數目。 增加此值可讓伺服器更快速地接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
TransportMaxBufferSize |
32 KB | 應用程式在伺服器觀察回壓之前會緩衝處理的位元組數目上限。 增加此值可讓伺服器更快速地緩衝較大的訊息,而不需要等候回壓,但會增加記憶體消耗。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
MinimumProtocolVersion |
0 | 指定交涉通訊協定的最低版本。 這是用來將用戶端限制為較新版本。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
您可以提供LogLevel值,來代表記錄層級名稱,而不使用string值。 當您在無法存取SignalR常數的環境中設定LogLevel記錄時,這非常有用。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
下表列出可用的記錄層級。 提供給 configureLogging 的值設定將要記錄的日誌的 最小層級。 系統會記錄在此層級記錄的訊息, 或數據表中所列的層級。
| 繩子 | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
或information |
LogLevel.Information |
warn
或warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
在此版本的 Java 用戶端 WebSockets 中是唯一可用的傳輸。
在 Java 客戶端中,會使用 withTransport 方法在 HttpHubConnectionBuilder 選取傳輸。 Java 用戶端預設為使用 WebSockets 傳輸。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
備註
SignalR Java 用戶端尚不支援傳輸後援。
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持連線行為的其他選項可以在HubConnection 物件本身取得。
| 選項 | 預設值 | 說明 |
|---|---|---|
ServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器 KeepAliveInterval 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器握手逾時。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 決定客戶端傳送 Ping 訊息的間隔。 從客戶端傳送任何訊息會將定時器重設為間隔的開頭。 如果用戶端尚未在伺服器上的集合中 ClientTimeoutInterval 傳送訊息,伺服器就會將用戶端視為已中斷連線。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 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();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
其他資源
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以在伺服器上使用 AddJsonProtocol 擴充方法來設定 JSON 序列化。 在AddJsonProtocol中可以在AddSignalR之後新增Program.cs。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerOptions 物件的 屬性是 System.Text.JsonJsonSerializerOptions 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 System.Text.Json 檔。
例如,若要將序列化器設定為不要變更屬性名稱的大小寫,而不是預設的駱駝峰命名法名稱,請在 中使用下列程式碼:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
切換至 Newtonsoft.Json
如果您需要 中Newtonsoft.Json不支援的功能System.Text.Json,請參閱切換至 Newtonsoft.Json。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | 如果用戶端尚未在此間隔內收到訊息(包括 keep-alive),伺服器就會將用戶端視為已中斷連線。 由於實作方式,標記客戶端為斷線可能需要超過此逾時間隔。 建議的值是 KeepAliveInterval 值的兩倍。 |
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
StreamBufferCapacity |
10 |
用戶端上傳數據流可以緩衝處理的項目數目上限。 如果達到此限制,則會封鎖叫用的處理,直到伺服器處理數據流項目為止。 |
MaximumReceiveMessageSize |
32 KB | 單一傳入中樞訊息的大小上限。 增加此值可能會增加 阻斷服務 (DoS) 攻擊的風險。 |
MaximumParallelInvocationsPerClient |
1 | 每個用戶端在佇列之前可以平行呼叫的中樞方法數目上限。 |
您可以在 AddSignalR 中,透過提供給Program.cs呼叫的選項委派,為所有中心設定選項。
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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();
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
64 KB | 在應用回壓之前,伺服器會緩衝從用戶端接收的最大位元組數目。 增加此值可讓伺服器更快接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
TransportMaxBufferSize |
64 KB | 應用程式在伺服器觀察回壓之前會緩衝處理的位元組數目上限。 增加此值可讓伺服器更快速地緩衝處理較大的訊息,而不需要等候backpressure,但會增加記憶體耗用量。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
MinimumProtocolVersion |
0 | 指定交涉通訊協定的最低版本。 這是用來將用戶端限制為較新版本。 |
CloseOnAuthenticationExpiration |
假的 | 設定此選項以啟用驗證到期追蹤,以在令牌到期時關閉連線。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
您可以提供LogLevel值,來代表記錄層級名稱,而不使用string值。 當您在無法存取SignalR常數的環境中設定LogLevel記錄時,這非常有用。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
下表列出可用的記錄層級。 提供給 configureLogging 的值設定將要記錄的日誌的 最小層級。 系統會記錄在此層級記錄的訊息, 或數據表中所列的層級。
| 繩子 | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
或information |
LogLevel.Information |
warn
或warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
在此版本的 Java 用戶端 WebSockets 中是唯一可用的傳輸。
在 Java 客戶端中,會使用 withTransport 方法在 HttpHubConnectionBuilder 選取傳輸。 Java 用戶端預設為使用 WebSockets 傳輸。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
備註
SignalR Java 用戶端尚不支援傳輸後援。
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持連線行為的其他選項可以在HubConnection 物件本身取得。
| 選項 | 預設值 | 說明 |
|---|---|---|
ServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器 KeepAliveInterval 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器握手逾時。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 決定客戶端傳送 Ping 訊息的間隔。 從客戶端傳送任何訊息會將定時器重設為間隔的開頭。 如果用戶端尚未在伺服器上的集合中 ClientTimeoutInterval 傳送訊息,伺服器就會將用戶端視為已中斷連線。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
ApplicationMaxBufferSize |
1 MB | 用戶端在套用 backpressure 之前,從伺服器接收的最大位元組數。 增加此值可讓用戶端更快接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
TransportMaxBufferSize |
1 MB | 用戶端在觀察反壓之前會緩衝處理的使用者應用程式所傳送的最大位元元組數目。 增加此值可以讓用戶端在不等待反壓控制的情況下,更迅速地緩衝較大的訊息,但可能會增加記憶體的使用量。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 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();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
其他資源
JSON/MessagePack 串行化選項
ASP.NET Core SignalR 支援兩種編碼訊息的通訊協定: JSON 和 MessagePack。 每個通訊協定都有串行化組態選項。
您可以在伺服器上使用 AddJsonProtocol 擴充方法來設定 JSON 序列化。 在AddJsonProtocol中可以在AddSignalR之後新增Startup.ConfigureServices。 方法 AddJsonProtocol 會接受接收 options 物件的委派。 該 PayloadSerializerOptions 物件的 屬性是 System.Text.JsonJsonSerializerOptions 物件,可用來設定自變數和傳回值的串行化。 如需詳細資訊,請參閱 System.Text.Json 檔。
例如,若要將序列化器設定為不要變更屬性名稱的大小寫,而不是預設的駱駝峰命名法名稱,請在 中使用下列程式碼:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
在 .NET 用戶端中,相同的 AddJsonProtocol 擴充方法存在於 上 HubConnectionBuilder。
Microsoft.Extensions.DependencyInjection命名空間必須匯入,才能解析擴充方法:
// 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();
備註
目前無法在 JavaScript 用戶端中設定 JSON 串行化。
切換至 Newtonsoft.Json
如果您需要 中Newtonsoft.Json不支援的功能System.Text.Json,請參閱切換至 Newtonsoft.Json。
MessagePack 串行化選項
您可以透過提供委派給 AddMessagePackProtocol 呼叫來設定 MessagePack 序列化。 如需詳細資訊,請參閱 中的 SignalRMessagePack。
備註
目前無法在 JavaScript 用戶端中設定 MessagePack 串行化。
設定伺服器選項
下表說明設定 SignalR 中樞的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | 如果用戶端尚未在此間隔內收到訊息(包括 keep-alive),伺服器就會將用戶端視為已中斷連線。 由於實作方式,標記客戶端為斷線可能需要超過此逾時間隔。 建議的值是 KeepAliveInterval 值的兩倍。 |
HandshakeTimeout |
15 秒 | 如果用戶端在此時間間隔內未傳送初始交握訊息,連線就會關閉。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 如果伺服器未在此間隔內傳送訊息,則會自動傳送 Ping 訊息以保持連線開啟。 變更 KeepAliveInterval 時,請在用戶端上變更 ServerTimeout 或者 serverTimeoutInMilliseconds 設定。 建議 ServerTimeout 或 serverTimeoutInMilliseconds 的值是 KeepAliveInterval 值的兩倍。 |
SupportedProtocols |
所有已安裝的通訊協定 | 此中樞支持的通訊協定。 根據預設,允許在伺服器上註冊的所有通訊協定。 您可以從此清單中移除通訊協定,以停用個別中樞的特定通訊協定。 |
EnableDetailedErrors |
false |
如果 true為 ,當 Hub 方法中擲回例外狀況時,會傳回詳細的例外狀況訊息給用戶端。 預設值是 false 因為這些例外狀況訊息可以包含敏感性資訊。 |
StreamBufferCapacity |
10 |
用戶端上傳數據流可以緩衝處理的項目數目上限。 如果達到此限制,則會封鎖叫用的處理,直到伺服器處理數據流項目為止。 |
MaximumReceiveMessageSize |
32 KB | 單一傳入中樞訊息的大小上限。 增加此值可能會增加 阻斷服務 (DoS) 攻擊的風險。 |
MaximumParallelInvocationsPerClient |
1 | 每個用戶端在佇列之前可以平行呼叫的中樞方法數目上限。 |
DisableImplicitFromServicesParameters |
false |
如果可能,中樞方法的參數將從 DI 解析。 |
您可以在 AddSignalR 中,透過提供給Program.cs呼叫的選項委派,為所有中心設定選項。
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
單一中樞的選項將會覆蓋AddSignalR中提供的全域選項,並且可以使用AddHubOptions來設定:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
進階 HTTP 組態選項
使用 HttpConnectionDispatcherOptions 來設定與傳輸和記憶體緩衝區管理相關的進階設定。 這些選項是藉由將委派傳遞至MapHub中的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();
下表說明設定 ASP.NET Core SignalR進階 HTTP 選項的選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
ApplicationMaxBufferSize |
64 KB | 在應用回壓之前,伺服器會緩衝從用戶端接收的最大位元組數目。 增加此值可讓伺服器更快接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
TransportMaxBufferSize |
64 KB | 應用程式在伺服器觀察回壓之前會緩衝處理的位元組數目上限。 增加此值可讓伺服器更快速地緩衝處理較大的訊息,而不需要等候backpressure,但會增加記憶體耗用量。 |
AuthorizationData |
自動收集的數據來自套用到 Hub 類別屬性中的 Authorize。 |
物件清單 IAuthorizeData ,用來判斷用戶端是否已獲得連線到中樞的授權。 |
Transports |
所有傳輸都會啟用。 | 可以用來限制用戶端連線傳輸的 HttpTransportType 位元旗標列舉值。 |
LongPolling |
請參閱下方。 | 特定於長輪詢傳輸的其他選項。 |
WebSockets |
請參閱下方。 | WebSocket 傳輸的附加選項。 |
MinimumProtocolVersion |
0 | 指定交涉通訊協定的最低版本。 這是用來將用戶端限制為較新版本。 |
CloseOnAuthenticationExpiration |
假的 | 設定此選項以啟用驗證到期追蹤,以在令牌到期時關閉連線。 |
Long Polling 傳輸具有額外選項,可透過LongPolling屬性進行配置。
| 選項 | 預設值 | 說明 |
|---|---|---|
PollTimeout |
90 秒 | 伺服器在終止單一輪詢要求之前,等候訊息傳送至客戶端的時間上限。 減少此值會導致用戶端更頻繁地發出新的輪詢要求。 |
WebSocket 傳輸有其他選項,可以透過 WebSockets 屬性進行設定。
| 選項 | 預設值 | 說明 |
|---|---|---|
CloseTimeout |
5 秒 | 伺服器關閉之後,如果用戶端在此時間間隔內無法關閉,連線就會終止。 |
SubProtocolSelector |
null |
委派,可用來將 Sec-WebSocket-Protocol 標頭設定為自定義值。 委派代理人會接收用戶端所要求的值作為輸入,且預期將傳回所要求的值。 |
設定客戶端選項
您可以在類型上 HubConnectionBuilder 設定用戶端選項(可在 .NET 和 JavaScript 用戶端中使用)。 它也可以在 Java 用戶端中使用,但HttpHubConnectionBuilder子類別和HubConnection本身都包含產生器組態選項。
設定日誌記錄
在 .NET 用戶端使用 ConfigureLogging 方法來設定記錄功能。 記錄提供者和篩選器可以像在伺服器上註冊一樣註冊。 如需詳細資訊,請參閱 ASP.NET Core 中的記錄 檔。
備註
若要註冊日誌提供者,您必須安裝必要的套件。 如需完整清單,請參閱檔的 內建記錄提供者 一節。
例如,若要啟用主控台記錄,請安裝 Microsoft.Extensions.Logging.Console NuGet 套件。 呼叫AddConsole延伸方法:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
在 JavaScript 用戶端中,有類似的 configureLogging 方法存在。
LogLevel提供值,指出要產生之記錄訊息的最低層級。 記錄會寫入瀏覽器主控台視窗。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
您可以提供LogLevel值,來代表記錄層級名稱,而不使用string值。 當您在無法存取SignalR常數的環境中設定LogLevel記錄時,這非常有用。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
下表列出可用的記錄層級。 提供給 configureLogging 的值設定將要記錄的日誌的 最小層級。 系統會記錄在此層級記錄的訊息, 或數據表中所列的層級。
| 繩子 | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
或information |
LogLevel.Information |
warn
或warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
備註
若要完全停用記錄,請在 signalR.LogLevel.None 方法中指定 configureLogging 。
如需記錄的詳細資訊,請參閱 SignalR 診斷文件。
SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段顯示如何搭配使用 java.util.logging 與 SignalR Java 用戶端。
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
如果您未在相依性中設定記錄,則 SLF4J 會載入具有下列警告訊息的預設無作業記錄器:
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.
加以忽略沒有關係。
設定允許的傳輸
所使用的 SignalR 傳輸可以在 WithUrl 呼叫中設定 (在 JavaScript 中為 withUrl)。 可以使用 HttpTransportType 的位元 OR 的值來限制用戶端僅使用指定的傳輸方式。 默认情况下,所有傳輸都已啟用。
例如,若要停用 Server-Sent 事件傳輸,但允許 WebSocket 和長輪詢連線:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
在 JavaScript 用戶端中,您可以通過在提供給 transport 的選項物件上設定 withUrl 欄位來設定傳輸方法。
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
在此版本的 Java 用戶端 WebSockets 中是唯一可用的傳輸。
在 Java 客戶端中,會使用 withTransport 方法在 HttpHubConnectionBuilder 選取傳輸。 Java 用戶端預設為使用 WebSockets 傳輸。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
備註
SignalR Java 用戶端尚不支援傳輸後援。
設定持有人驗證
若要提供驗證數據以及 SignalR 要求,請使用 AccessTokenProvider 選項 (accessTokenFactory 在 JavaScript 中) 指定傳回所需存取權杖的函式。 在 .NET 用戶端中,此存取令牌會以 HTTP “Bearer Authentication” 令牌的形式傳遞(使用 Authorization 標頭搭配類型 Bearer)。 在 JavaScript 客戶端中,存取令牌會當作持有人令牌使用,除了在少數情況下,瀏覽器 API 會限制套用標頭的能力(具體而言,Server-Sent 事件和 WebSockets 要求中)。 在這些情況下,存取令牌會以查詢字串值 access_token的形式提供。
在 .NET 用戶端中,可以使用 AccessTokenProvider 中的選項委派來指定 WithUrl 選項。
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
在 JavaScript 用戶端中,存取令牌是藉由在 中的 accessTokenFactoryoptions 物件上設定 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();
在 Java 用戶端中 SignalR ,您可以藉由提供 HttpHubConnectionBuilder 的存取令牌處理站,來設定持有人令牌以用於驗證。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
設定逾時和連線存活選項
設定逾時和保持連線行為的其他選項可以在HubConnection 物件本身取得。
| 選項 | 預設值 | 說明 |
|---|---|---|
ServerTimeout |
30 秒 (30,000 毫秒) | 伺服器活動的逾時。 如果伺服器未在此間隔中傳送訊息,客戶端會考慮伺服器已中斷連線並觸發 Closed 事件(onclose 在 JavaScript 中)。 此值必須夠大,才能從伺服器傳送 Ping 訊息, 並在 逾時間隔內由用戶端接收。 建議的值至少是伺服器 KeepAliveInterval 值的兩倍,以允許 Ping 到達的時間。 |
HandshakeTimeout |
15 秒 | 初始伺服器握手逾時。 如果伺服器未在此間隔中傳送交握回應,用戶端會取消交握並觸發 Closed 事件(onclose 在 JavaScript 中)。 這是一個進階設定,只有在由於嚴重的網路延遲而發生交握逾時錯誤時才應進行修改。 如需更多交握過程的詳細資訊,請參閱SignalR Hub 協議規格。 |
KeepAliveInterval |
15 秒 | 決定客戶端傳送 Ping 訊息的間隔。 從客戶端傳送任何訊息會將定時器重設為間隔的開頭。 如果用戶端尚未在伺服器上的集合中 ClientTimeoutInterval 傳送訊息,伺服器就會將用戶端視為已中斷連線。 |
在 .NET 用戶端中,逾時值會指定為 TimeSpan 值。
設定其他選項
您可以在 WithUrl上的withUrl方法(在 JavaScript 中為HubConnectionBuilder),或在 Java 用戶端上的HttpHubConnectionBuilder的各種配置 API 上設定其他選項。
| .NET 選項 | 預設值 | 說明 |
|---|---|---|
AccessTokenProvider |
null |
一個函式會傳回一個字串,該字串在 HTTP 請求中作為 Bearer 驗證令牌提供。 |
SkipNegotiation |
false |
將此設定為 true 以略過交涉步驟。
只有在 WebSocket 傳輸是唯一啟用的傳輸時才支援。 使用 Azure SignalR 服務時,無法啟用此設定。 |
ClientCertificates |
空 | 用於傳送以驗證請求的 TLS 憑證集合。 |
Cookies |
空 | 要隨每個 HTTP 請求一起傳送的 HTTP Cookie 集合。 |
Credentials |
空 | 要隨每個 HTTP 要求一起傳送的認證。 |
CloseTimeout |
5 秒 | 僅限 WebSockets。 客戶端在關閉後等候伺服器確認關閉要求的時間上限。 如果伺服器在此時間內未確認關閉,用戶端就會中斷連線。 |
Headers |
空 | 要在每個 HTTP 要求中傳送的其他 HTTP 標頭的對應表。 |
HttpMessageHandlerFactory |
null |
可用來配置或替換用於發送 HTTP 請求的 HttpMessageHandler 的委派。 不適用於 WebSocket 連線。 此委派必須傳回非 Null 值,而且它會以參數的形式接收預設值。 修改該預設值的設定並傳回,或傳回新的 HttpMessageHandler 實例。
取代處理程式時,請務必複製您想要從提供的處理程式中保留的設定,否則,設定的選項(例如 Cookie 和標頭)將不會套用至新的處理程式。 |
Proxy |
null |
傳送 HTTP 要求時要使用的 HTTP Proxy。 |
UseDefaultCredentials |
false |
將此布爾值設定為傳送 HTTP 和 WebSockets 要求的預設認證。 這可讓您使用 Windows 驗證。 |
WebSocketConfiguration |
null |
可用來配置 WebSocket 其他選項的代委。 接收一個可用來設定選項的ClientWebSocketOptions實例。 |
ApplicationMaxBufferSize |
1 MB | 用戶端在套用 backpressure 之前,從伺服器接收的最大位元組數。 增加此值可讓用戶端更快接收較大的訊息,而不需要套用backpressure,但會增加記憶體耗用量。 |
TransportMaxBufferSize |
1 MB | 用戶端在觀察反壓之前會緩衝處理的使用者應用程式所傳送的最大位元元組數目。 增加此值可以讓用戶端在不等待反壓控制的情況下,更迅速地緩衝較大的訊息,但可能會增加記憶體的使用量。 |
在 .NET 用戶端中,這些選項可由選項委派提供給 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();
在 JavaScript 用戶端中,這些選項可以透過一個提供給 withUrl 的 JavaScript 物件來進行設定:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
在 Java 用戶端中,可以透過 HttpHubConnectionBuilder 傳回的 HubConnectionBuilder.create("HUB URL") 方法來設定這些選項。
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();