本節提供協助,針對嘗試建立與 ASP.NET Core SignalR 樞連線時可能發生的錯誤。
回應碼 404
使用 WebSockets 和 skipNegotiation = true 時
WebSocket connection to 'wss://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 404
在使用多部伺服器而未設置黏著會話的情況下,連線可能從一部伺服器開始,然後切換到另一部伺服器。 另一部伺服器並不知道先前的連線。
確認客戶端連線到正確的端點。 例如,伺服器載入於 ,
http://127.0.0.1:5000/hub/myHub而用戶端嘗試連線到http://127.0.0.1:5000/myHub。如果連線使用 ID,而且在協商之後傳送要求給伺服器的時間太長,伺服器:
- 刪除標識碼。
- 傳回 404 錯誤。
回應碼 400 或 503
針對下列錯誤:
WebSocket connection to 'wss://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 400
Error: Failed to start the connection: Error: There was an error with the transport.
此錯誤通常是由用戶端只使用 WebSocket 傳輸所造成,但伺服器上未啟用 WebSocket 通訊協定。
回應碼 307
使用 WebSockets 和 skipNegotiation = true 時
WebSocket connection to 'ws://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 307
在協商請求期間,也可能會發生此錯誤。
常見原因:
- 應用程式被設定為透過在
UseHttpsRedirection中呼叫Startup來強制使用 HTTPS,或者透過 URL 重寫規則強制使用 HTTPS。
可能的解決方案:
- 將客戶端上的 URL 從「http」變更為「https」。
.withUrl("https://xxx/HubName")
回應碼 405
Http 狀態代碼 405 - 方法不被允許
- 應用程式未啟用 CORS
回應碼 0
Http 狀態代碼 0 - 通常是 CORS 問題,沒有提供狀態代碼
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5000/default/negotiate?negotiateVersion=1. (Reason: CORS header 'Access-Control-Allow-Origin' missing).
- 將預期的來源新增至
.WithOrigins(...)
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5000/default/negotiate?negotiateVersion=1. (Reason: expected 'true' in CORS header 'Access-Control-Allow-Credentials').
- 新增
.AllowCredentials()至 CORS 政策。 無法搭配此選項使用.AllowAnyOrigin()或.WithOrigins("*")
回應碼 413
Http 狀態代碼 413 - 承載太大
這通常是因為具有超過 4k 的存取令牌所造成。
- 如果使用 Azure SignalR 服務,請使用下列方式自定義透過服務傳送的宣告來減少令牌大小:
.AddAzureSignalR(options =>
{
options.ClaimsProvider = context => context.User.Claims;
});
暫時性網路失敗
暫時性網路中斷可能會關閉SignalR連線。 伺服器可能會將關閉的連線解譯為正常用戶端中斷連線。 若要取得用戶端在那些情況下中斷連線原因的詳細資訊, 請從客戶端和伺服器收集記錄。