Blazorアプリケーションを実行環境に配置して実行すると、WebScoketのレスポンスが 「Unexpected response code: 200」 になる

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
iPentec all rights reserverd.