You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IIS部署Flask-Socket.IO出现WebSocket建立连接前断开错误如何解决

可行解决方案

1. 核心问题根因

WFastCGI本身仅支持短生命周期的普通HTTP请求,无法承载WebSocket全双工长连接,所以无论怎么调整IIS WebSocket配置和Flask侧参数,只要Socket.IO请求走WFastCGI链路就必然会断开。

2. 具体解决步骤

  • 第一步:拆分应用运行链路,Socket.IO相关请求不再走WFastCGI
    编写独立启动脚本,用eventlet直接运行Flask应用,作为本地后端服务:
    import eventlet
    eventlet.monkey_patch()
    # 替换为你自己的app实例和socketio实例
    from your_app import app, socketio
    
    if __name__ == '__main__':
        socketio.run(app, host='127.0.0.1', port=5000, debug=False)
    
    可以用NSSM工具将该启动脚本注册为Windows系统服务,实现开机自启、后台稳定运行。
  • 第二步:配置IIS反向代理转发Socket.IO请求
    先为IIS安装ARR(Application Request Routing)和URL Rewrite模块,开启ARR代理功能,将响应缓冲阈值设为0避免长连接被阻塞。
    在站点的web.config中添加重定向规则,将所有socket.io路径的请求转发到本地启动的eventlet服务:
    <rule name="SocketIO_Proxy" stopProcessing="true">
      <match url="socket.io/(.*)" />
      <action type="Rewrite" url="http://127.0.0.1:5000/socket.io/{R:1}" />
      <!-- 站点用HTTPS的话添加下面的配置,HTTP可忽略 -->
      <serverVariables>
        <set name="HTTP_X_FORWARDED_PROTO" value="https" />
      </serverVariables>
    </rule>
    
  • 第三步:调整Socket.IO初始化适配配置
    socketio.init_app(
        app,
        # 生产环境替换为实际业务域名,禁止使用*
        cors_allowed_origins="*",
        async_mode="eventlet",
        # 排查问题时开启日志,稳定运行后可关闭
        engineio_logger=False,
        logger=False
    )
    
  • 第四步:优化IIS长连接配置
    保持IIS的WebSocket Protocol功能为开启状态,将站点socket.io路径的请求超时时间调整为3600秒以上,避免空闲长连接被主动断开。
    客户端连接时指定传输优先级,优先使用WebSocket:
    const socket = io({
      transports: ["websocket", "polling"]
    })
    

内容的提问来源于stack exchange,提问作者lc-51

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:57:01