以编程方式关闭与 IIS 的 HTTP/2 连接
Posted
技术标签:
【中文标题】以编程方式关闭与 IIS 的 HTTP/2 连接【英文标题】:Closing down HTTP/2 connections to IIS programmatically 【发布时间】:2021-05-26 07:45:15 【问题描述】:有没有一种简单的方法可以优雅地关闭与 IIS 的 HTTP/2 连接?对于 http/1.1,我们只需将标头更改为 Connection: Close or recycle the app pool,这会丢弃所有保持活动的 http 连接,但我们找不到 http/2 的方法。
场景。我们在农场中有一台服务器,我们正试图在基本的天蓝色负载均衡器后面正常关闭它。我们有一个负载平衡器探测端口,一旦关闭的流量停止被定向到服务器。这一切都有效,但 http/2 连接保持连接并发送请求。 Keep-Alive 被禁用。停止或回收应用程序池会使连接保持连接状态。
我们可以编写一个脚本在关闭之前强制终止套接字,但我猜如果它在中间请求中我们有客户端问题,或者 HTTP/2 协议是否足够聪明来处理这个问题?在 Chrome 中尝试它没有问题,但在更长的运行请求期间却没有。
我们可以重新启动 IIS,但此时我们不妨关闭服务器。
有没有通过 http.sys/http api 断开这些连接?
【问题讨论】:
这不是我的强项,但是你能不能给他们都发个goaway frame? 完全考虑过这一点,但只是不确定当我无法访问套接字(由系统管理)时是否可以发送一个离开帧 【参考方案1】:如果将 Connection: close 添加到 HTTP/2 流的标头中,则绝不会影响 HTTP/2 会话的状态。如果服务器正在关闭,HTTP/2 实现会停止所有 HTTP/2 会话。
根据 Microsoft 文档,我们可以使用 reset。
重置允许服务器使用指定的错误代码重置 HTTP/2 请求。重置请求被视为中止。
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
有关“在 IIS 上使用带有 HTTP/2 的 ASP.NET Core”的信息,可以参考这个link。
【讨论】:
谢谢你。我知道连接:关闭标题。我以为我是赢家,直到我意识到它不支持 http/2。不幸的是,在这个场景中,服务器的管理发生在应用程序及其主要是 .net 框架的东西之外,所以如果我们要找到一个 .net 框架解决方案来解决这个问题,这将是一个非常昂贵的部署。试图从核心/中心点找到一种方法。 我们可以使用代码重置HTTP/2请求。以上是关于以编程方式关闭与 IIS 的 HTTP/2 连接的主要内容,如果未能解决你的问题,请参考以下文章
如何从 .NET 类中以编程方式访问服务器级 IIS 连接设置?
在 Windows 上的 Java 中以编程方式创建 wifi 对等连接? [关闭]