Blazorアプリケーションを実行環境に配置して実行すると、WebScoketのレスポンスが 「Unexpected response code: 200」 になる現象について紹介します。
現象
Blazorアプリケーションをサーバーに配置してWebブラウザでアクセスして実行して、デバッグツールや開発者ツールで確認すると
WebSocketのレスポンスがエラーになっており、以下のレスポンスになります。
レスポンスメッセージ
Error during WebSocket handshake: Unexpected response code: 200
なお、WebSocketのレスポンスはエラーですが、Blazorアプリケーションは動作します。
原因
いくつかの原因がありますが、主なものは次の2つです。
- Webサーバー (IIS) にWebScoketの機能がインストールされていない
- リバースプロキシ / ロードバランサがWebSocketに対応していない
Webサーバー (IIS) にWebScoketの機能がインストールされていない
WebサーバーにWebSocketの機能がインストールされていない場合は、サーバーとWebSocketの接続ができないため、エラーになります。
対処法は、WebサーバーにWebSocketの機能をインストールします。
IISにWebSocketの機能をインストールする手順については
こちらの記事を参照してください。
リバースプロキシ / ロードバランサがWebSocketに対応していない
サーバーとの経路内にリバースプロキシやロードバランサが設置されており、ルーティングをしている接続経路で、
リバースプロキシやロードバランサがWebSocketに対応していないと、WebサーバーとWebSocketで接続ができず、
上記のエラーが発生します。
この場合は、アプリケーションサーバーとの間にリバースプロキシやロードバランサを入れない構成に変更するか、
リバースプロキシをWebScoketに対応したものに変更する方法があります。
補足
ロードバランサを利用している場合や、リバースプロキシで背後にサーバーが複数台ある場合は、
Blazorアプリケーションはステートフルなアプリケーションのため、同一セッションが同じサーバーへのアクセスとなる必要があります。
ロードバランサやリバースプロキシに、スティッキー セッションを有効にして設定する必要があります。
WebSocketが使えなくてもBlazorアプリが動作する理由
WebSocketの接続がエラーでもBlazorアプリケーションは動作します。これは、
WebSocketが利用できない場合には、ロングポーリング(Long Polling)でBlazorサーバーと通信してアプリケーションを実行するためです。
動作例
リバースプロキシ(WebSocket非対応)がある場合
サーバーの経路の途中にリバースプロキシがある場合のレスポンスです。
WebSocketのレスポンスが、
Error during WebSocket handshake: Unexpected response code: 200
になります。
また、コンソールに以下のメッセージが表示されます。
メッセージ
Error: Failed to start the transport 'WebSockets': Error: WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.
メッセージ(日本語訳)
エラー:トランスポート 'WebSockets' の起動に失敗しました。
エラー: WebSocket の接続に失敗しました。サーバーで接続が見つかりませんでした。エンドポイントが SignalR エンドポイントではないか、接続 ID がサーバーに存在しないか、WebSocket をブロックしているプロキシが存在します。複数のサーバーがある場合は、スティッキー セッションが有効になっていることを確認します。
Webサーバーと直接接続した場合
Webサーバーと直接接続した場合は、WebSocketでメッセージのやり取りが実行されます。
WebSocketに対応したリバースプロキシ経由で接続した場合
WebSocketに対応したリバースプロキシ経由で接続した場合は、WebSocketでメッセージのやり取りが実行されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-06-29
作成日: 2023-03-02