2013-10-21 26 views
7

WebSocketCollectionに接続されたクライアントを保持しているMicrosoft.Web.WebSockets.WebSocketHandlerを使用してWebSocketサーバーを操作します。クライアントがネットワーク接続を失うと、サーバーでOnCloseメソッドとOnErrorメソッドが呼び出されません。さらに、コレクション内の特定のクライアントを見ると、そのWebSocket.Stateはまだ接続されていると記述されています。これはIIS8にあります。WebSocketクライアントの状態がネットワーク損失で変更されない

手動でクライアントにメッセージを送信し、応答を探していない場合、クライアントがネットワークを切断したと判断する別の方法がありますか?いくつかのIIS構成がありますか?ありがとう。

答えて

-1

これはTCPです。送信または受信しないときに、ピアがまだ存在するかどうか、どのように知ることができますか?

ピアプロセスを強制終了したり、マシンを再起動した場合、そのピアのOSネットワーキングスタックは通常、TCPを積極的に閉じるため、失われたWebSocket検出もすぐに検出されます。しかし、単にピア(電源またはネットワーク)のプラグを引っ張ったり、何か他のことが起こった場合、TCPは積極的に閉じられません。

WebSocketのコンテキストでは、WebSocketレベルのping/pong(IISがWS ping/pong heartbeatingをサポートしているかどうかわかりません)、小さなWSメッセージを送信することでアプリケーションレベルのハートビートを行うことができます。

14

私は2つのステップで自分の問題を解決することができました。まず、IISの設定を編集するプロンプトで次のコマンドを実行しました。

cd \Windows\System32\inetsrv 
appcmd unlock config /section:system.webServer/websocket 

次に、Web.configを次のように更新しました。

<system.webServer> 
    <webSocket enabled="true" pingInterval="00:00:05" /> 
<system.webServer /> 
+1

これは素晴らしい答えだと私は持っていたSignalR接続の問題を診断するときには本当に助け:5Sはあまりにもアグレッシブな感じしかしhttps://github.com/SignalR/SignalR/issues/3476#issuecomment-127209897を参照してください。 。この価値は実際にあなたのために働き続けましたか? – swl10

+0

私にとっては、内のでした。最後に、サーバーは2倍の間隔= 8秒でpingを実行していました。 <タスクコマンドライン= "STARTUP.CMD" のExecutionContext = "上昇" TaskType属性= "フォアグラウンド" /> STARTUP.CMD:アズールでのWebの役割のために私はServiceDefinition.csdefにSTARTUP.CMDタスクを追加する必要がありました: %SYSTEMROOT%\ System32 \ inetsrv \ appcmd unlock config /section:system.webServer/websocket –

+0

IISではなくWindowsサービスでSignalRをホストする場合、この設定が有効になりますか? – python

関連する問題