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

IIS 10.0启用TLS/SSL后停止站点仍保持WebSocket连接问题

问题描述

我在Windows Server 2019 Standard上运行IIS 10.0,部署了基于ASP.NET Framework 4.7.2的简单应用,包含长连接WebSocket和SignalR。

  • 使用非安全套接字时,停止站点后套接字会正常关闭,运行正常。
  • 启用安全套接字连接(TLS/SSL)后,只要套接字处于打开状态,工作进程就会挂起,客户端仍能与服务器收发响应,仅能通过客户端重启连接解决。
  • 直接WebSocket或SignalR均会触发该问题:尝试停止站点后,应用仍通过安全套接字收发消息;套接字关闭后,工作进程才会按预期终止。
  • 存在一个未获回复的类似问题:服务器在IIS站点停止后仍向客户端发送ping消息。
  • 连接不会在应用池超时(90秒)后断开。
  • 活动连接截图:活动连接截图

更新:
更换端口但仍使用安全连接时,问题消失。停止站点后连接断开,工作进程按预期终止,看来该问题与443端口相关。

疑问

请问该问题成因是什么?如何确保IIS收到停止/回收请求时断开这些连接?


问题分析与解决方案

可能成因

  1. 443端口的TLS会话复用机制:IIS默认对443端口启用TLS会话复用(依托HTTP.sys的系统级连接池),站点停止时,HTTP.sys不会主动中断已建立的TLS长连接——这些连接属于系统连接池,不受站点进程单独管控。而非443端口的TLS连接可能未启用该复用机制,或系统对非标准端口的连接池处理逻辑不同。
  2. HTTP.sys与IIS进程交互缺陷:站点停止时,IIS向HTTP.sys发送停止路由请求,但HTTP.sys未正确终止关联的TLS长连接,导致请求仍会转发给已标记停止的工作进程,让进程无法正常退出。
  3. ASP.NET Framework 4.7.2长连接清理疏漏:该版本对TLS环境下的WebSocket/SignalR连接,在站点停止时的资源清理逻辑存在不足,未主动触发连接关闭,依赖客户端超时或主动断开,而HTTP.sys的连接复用又延长了连接存活时间。

解决方案

1. 禁用443端口的TLS会话复用

通过注册表修改关闭HTTP.sys的TLS会话复用:

  • 打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters
  • 新建DWORD类型项EnableSslSessionTicket,设置值为0
  • 重启HTTP服务(命令行执行net stop http && net start http,注意此操作会中断所有依赖HTTP.sys的服务)

2. 配置IIS站点连接终止策略

  • 在IIS管理器中进入站点高级设置,将连接超时设为较短时间(如30秒),但此设置仅影响新连接,对已建立的长连接无效。
  • 使用appcmd命令配置站点回收规则,强制停止时终止连接:
    appcmd set site "你的站点名称" /limits.connectionTimeout:00:00:30 /applicationDefaults.recycling.periodicRestart.time:00:00:00
    

3. 应用代码中主动处理站点停止事件

在ASP.NET应用的Global.asax中注册Application_End事件,主动关闭所有长连接:

protected void Application_End(object sender, EventArgs e)
{
    // 关闭所有SignalR连接
    GlobalHost.ConnectionManager.GetHubContext<YourHub>().Clients.All.disconnect();
    
    // 关闭原生WebSocket连接(需自行维护已连接实例集合)
    foreach (var ws in WebSocketConnections)
    {
        ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Server shutting down", CancellationToken.None).Wait();
    }
}

4. 强制回收应用池

  • 在应用池回收设置中,勾选回收工作进程(在请求时),站点停止时IIS会强制终止工作进程,但可能无优雅断开提示。
  • 命令行执行强制回收:
    appcmd recycle apppool "你的应用池名称"
    

5. 升级ASP.NET Framework版本

升级到ASP.NET Framework 4.8及以上版本,微软在后续版本中修复了部分TLS环境下长连接的资源清理问题,可能解决此故障。


内容的提问来源于stack exchange,提问作者GmodCake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:25:24