このセクションでは、ASP.NET Core SignalR ハブへの接続を確立しようとしたときに発生する可能性があるエラーについて説明します。
応答コード 404
WebSockets および skipNegotiation = true
を使用する場合
WebSocket connection to 'wss://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 404
スティッキー セッションのない複数のサーバーを使用する場合、接続は 1 つのサーバーで開始してから、別のサーバーに切り替えることができます。 もう一方のサーバーは、以前の接続を認識していません。
クライアントが正しいエンドポイントに接続されていることを確認します。 たとえば、サーバーは
http://127.0.0.1:5000/hub/myHub
でホストされ、クライアントはhttp://127.0.0.1:5000/myHub
に接続しようとしています。接続で ID が使用され、ネゴシエート後にサーバーに要求を送信するのに時間がかかりすぎる場合、サーバーは次のようになります。
- 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').
- CORS ポリシーに
.AllowCredentials()
を追加します。 このオプションで.AllowAnyOrigin()
または.WithOrigins("*")
を使用できません
応答コード 413
Http 状態コード 413 - ペイロードが大きすぎます
これは多くの場合、4k を超えるアクセス トークンを持っていることが原因で発生します。
- Azure SignalR Service を使用する場合は、次の方法でサービス経由で送信される要求をカスタマイズしてトークン サイズを小さくします。
.AddAzureSignalR(options =>
{
options.ClaimsProvider = context => context.User.Claims;
});
一時的なネットワーク障害
一時的なネットワーク障害が発生すると、 SignalR 接続が閉じる可能性があります。 サーバーは、閉じた接続をグレースフル クライアント切断と解釈できます。 このような場合にクライアントが切断された理由の詳細については、 クライアントとサーバーからログを収集します。
その他のリソース
ASP.NET Core