針對連線問題進行疑難排解
本節協助處理嘗試建立與 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
。如果連線使用識別碼,而且在交涉之後,花太長的時間傳送要求給伺服器,則伺服器會:
- 刪除識別碼。
- 傳回 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
在交涉要求期間,也可能會發生此錯誤。
常見原因:
- 應用程式已設為藉由在
Startup
中呼叫UseHttpsRedirection
來強制執行 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 連線。 伺服器可能會將關閉的連線解譯為正常用戶端中斷連線。 若要取得用戶端在那些情況下為何會中斷連線的詳細資訊,請從用戶端和伺服器蒐集記錄。