【问题标题】:WebSocket Client's State Not Changing on Network LossWebSocket 客户端的状态不会因网络丢失而改变
【发布时间】:2013-10-21 19:11:17
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net .net websocket


    【解决方案1】:

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

    <configSections>
            <sectionGroup name="system.webServer">
                ...
                <section name="webSocket" overrideModeDefault="Allow" />
            </sectionGroup>
    <configSections>
    

    【讨论】:

    • 这是一个很好的答案,在诊断我遇到的 SignalR 连接问题时确实很有帮助:请参阅 github.com/SignalR/SignalR/issues/3476#issuecomment-127209897 但是 5s 感觉太激进了。这个价值在实践中是否继续为您服务?
    • 对我来说只是 中。最后,服务器在双倍间隔 = 8 秒内 ping。对于 Azure 中的 Web 角色,我必须将 Startup.cmd 任务添加到 ServiceDefinition.csdef: Startup.cmd: %SYSTEMROOT%\System32\inetsrv\appcmd 解锁配置 /section:system.webServer/websocket
    • 在 Windows 服务而不是 IIS 上托管 SignalR 时,此配置是否有效?
    【解决方案2】:

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

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

    在 WebSocket 的上下文中,您可以进行 WebSocket 级别的 ping/pongs(不知道 IIS 是否支持 .. WS ping/pong 心跳),或者您可以通过发送小的 WS 消息来进行应用级别的心跳。

    【讨论】:

    • 答案其实是正确的。 TCP 具有会话管理功能,但如果计算机死机,则无法发送断开连接,如答案中所述。
    猜你喜欢
    • 2022-01-06
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多