C# WebSocket客户端';s状态在网络丢失时不改变

C# WebSocket客户端';s状态在网络丢失时不改变,c#,asp.net,.net,websocket,C#,Asp.net,.net,Websocket,使用Microsoft.Web.WebSockets.WebSocketHandler处理WebSocket服务器,我将连接的客户端保存在WebSocketCollection中。当客户端失去其网络连接时,在服务器上不会调用OnClose和OnError方法。此外,查看集合中的特定客户机可以发现其WebSocket.State仍被描述为已连接。这在IIS8上 除了手动向客户端发送消息并查找响应外,还有其他方法可以确定客户端已断开网络连接吗?是否缺少某些IIS配置?谢谢。这是TCP:当你不发送或接

使用Microsoft.Web.WebSockets.WebSocketHandler处理WebSocket服务器,我将连接的客户端保存在WebSocketCollection中。当客户端失去其网络连接时,在服务器上不会调用OnClose和OnError方法。此外,查看集合中的特定客户机可以发现其WebSocket.State仍被描述为已连接。这在IIS8上


除了手动向客户端发送消息并查找响应外,还有其他方法可以确定客户端已断开网络连接吗?是否缺少某些IIS配置?谢谢。

这是TCP:当你不发送或接收时,你怎么知道对方是否还在那里

如果您杀死对等进程或重新启动其机器,该对等进程的OS网络堆栈通常会主动关闭TCP,因此您也会立即检测到丢失的WebSocket检测。但是,如果您只是拔掉对等机(电源或网络)上的插头或发生其他严重情况,TCP不会主动关闭


在WebSocket的上下文中,您可以执行WebSocket级别的ping/pong(不知道IIS是否支持..WS ping/pong heartbeating),也可以通过发送小的WS消息来执行应用程序级别的heartbeating。

我可以通过两个步骤解决我的问题。首先,我在提示下运行以下命令来编辑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 />

对于IIS Express和VS项目,必须编辑“applicationhost.config”文件并更改overrideModeDefault=“Allow”


...

这是一个很好的答案,在诊断我遇到的信号机连接问题时确实很有帮助:请看,5s感觉太咄咄逼人了。这个价值观在实践中是否继续适用于你?对我来说,它只是在你的内心深处。最后,服务器ping的时间间隔为8秒。对于Azure中的web角色,我必须将Startup.cmd任务添加到ServiceDefinition.csdef:Startup.cmd:%SYSTEMROOT%\System32\inetsrv\appcmd unlock config/section:system.webServer/websocketWill此配置在windows服务而不是IIS上托管SignalR时起作用?答案实际上是正确的。TCP具有会话管理功能,但如果计算机如回答中所述死亡,则无法发送断开连接。
<configSections>
        <sectionGroup name="system.webServer">
            ...
            <section name="webSocket" overrideModeDefault="Allow" />
        </sectionGroup>
<configSections>