Azure Web App问题:WebSocket连接100秒后自动中止
解决OWIN WebSocket 100秒规律性断开问题
根据你描述的情况——不管部署到Azure Web App还是本地IIS Express,WebSocket连接都会在100秒左右准时断开——这个问题几乎可以肯定是空闲超时机制在作祟。刚好这个100秒的时长,和Azure Web App默认的WebSocket空闲超时时间完全匹配,IIS Express的默认配置也会触发类似的短超时。下面是具体的解决方案:
1. 给WebSocket添加心跳(Ping/Pong)机制
这是最根本的解决办法,不管服务器怎么配置,只要保持连接有持续的小数据传输,就能避免被判定为空闲。我之前处理类似问题时,会在OWIN的WebSocket处理逻辑里加一个后台任务定时发送Ping帧:
public async Task ProcessWebSocketRequest(WebSocket webSocket) { var keepAliveToken = new CancellationTokenSource(); // 启动心跳任务,每30秒发一次Ping(远小于100秒超时阈值) var keepAliveTask = Task.Run(async () => { while (!keepAliveToken.IsCancellationRequested) { await Task.Delay(30000); if (webSocket.State == WebSocketState.Open) { await webSocket.SendAsync( new ArraySegment<byte>(new byte[0]), WebSocketMessageType.Ping, true, CancellationToken.None); } } }); // 这里写你的客户端消息处理逻辑... // 连接断开时取消心跳任务 keepAliveToken.Cancel(); await keepAliveTask; }
2. 调整Azure Web App的WebSocket超时配置
如果不想依赖心跳(或者作为补充方案),可以直接修改Azure Web App的超时设置:
- 登录Azure门户,找到你的目标Web App
- 进入「配置」→「常规设置」页面
- 在「WebSocket」区域,把「空闲超时」调整为你需要的时长(比如设为3600秒,也就是1小时)
- 也可以通过添加应用环境变量的方式配置:新增
WEBSOCKET_IDLE_TIMEOUT变量,值设为你想要的秒数
3. 修改IIS Express的超时设置
本地测试用IIS Express时,需要调整它的配置文件:
- 找到IIS Express的
applicationhost.config文件,通常路径是Documents\IISExpress\config\applicationhost.config - 定位到你项目对应的站点节点,在
<webSocket>标签里修改timeout和pingInterval属性:
<site name="YourWebSocketApp" id="1"> <!-- 其他站点配置... --> <webSocket enabled="true" pingInterval="00:00:10" timeout="00:30:00" /> </site>
这里把超时设为30分钟,Ping间隔设为10秒,确保本地测试时不会提前断开连接。
建议优先测试心跳机制,这是跨环境通用的解决方案,再配合服务器端的超时配置,就能彻底解决这个规律性断开的问题了。
内容的提问来源于stack exchange,提问作者Sam Holder
相关产品推荐
相关产品推荐

