2013-10-21 69 views
7

使用Microsoft.Web.WebSockets.WebSocketHandler在那裏我保持連接的客戶端在WebSocketCollection一個WebSocket的服務器工作。當客戶端失去其網絡連接時,在服務器上不會調用OnClose和OnError方法。此外,看集合在特定的客戶端顯示,其WebSocket.State仍可謂連接。這是在IIS8上。的WebSocket客戶端的狀態不改變網絡丟包

短的手動發送客戶端的消息,並尋找一個響應,有另一種方式來確定客戶端已經放棄了網絡的?是否有一些我缺少的IIS配置?謝謝。

回答

-1

這是TCP:當你不發送或接收,你怎麼能知道對方仍然存在或消失?

如果你殺死同行進程或重新啓動它的機器,該同級的OS網絡堆棧通常會主動關閉TCP,讓你馬上來檢測丟失WebSocket的檢測也。但是,如果您只是在對等端(電源或網絡)上拔插頭或發生其他嚴重事件,則TCP不會主動關閉。

在網頁套接字的情況下,你可以做的WebSocket級坪/ pongs(不知道是不是IIS支持.. WS平/乒乓球心跳),或者你可以通過發送小WS消息做應用級別的心跳。

14

我能用兩個步驟解決我的問題。首先,我在提示符處運行以下命令來編輯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連接的問題時,確實幫助:請參見https://github.com/SignalR/SignalR/issues/3476#issuecomment-127209897然而5S感覺過於激進。這個價值在實踐中是否繼續適合你? – swl10

+0

對我來說,這只是。最後,服務器在雙倍間隔= 8秒內進行ping操作。對於Azure的Web角色我不得不STARTUP.CMD任務添加到ServiceDefinition.csdef中: <任務命令行= 「STARTUP.CMD」 的ExecutionContext = 「架空」 任務類型= 「前臺」/> STARTUP.CMD: %SYSTEMROOT%\ System32 \ inetsrv \ appcmd解鎖配置/section:system.webServer/websocket –

+0

當在Windows服務上託管SignalR而不是IIS時,此配置是否可以工作? – python