启用HTTP/2时Azure App Service连接断开问题求助
ASP.NET网站在Azure App Service上HTTP/2下特定页面连接重置的解决方案
问题现象
部署在Azure App Service的ASP.NET站点,某特定页面在HTTP/2请求时会在1秒内被断开连接,curl测试返回如下错误:
* Recv failure: Connection reset by peer * LibreSSL SSL_read: Connection reset by peer, errno 54 * Failed receiving HTTP2 data: 56(Failure when receiving data from the peer) * Connection #0 to host my-website.azurewebsites.net left intact curl: (56) Recv failure: Connection reset by peer
站点日志显示返回200响应,但实际连接被重置;使用curl --http1.1参数请求该页面正常,禁用HTTP/2后浏览器可正常访问。
排查与解决步骤
1. 检查响应头部与内容长度一致性
HTTP/2对响应规范的校验比HTTP/1.1更严格,若页面存在以下情况,Azure的HTTP/2代理可能直接重置连接:
Content-Length头部声明的长度与实际响应内容长度不匹配- 同时设置了
Transfer-Encoding: chunked和Content-Length头部 - 自定义头部包含大写字母(HTTP/2要求头部名称必须小写)
解决方式:
- 移除手动设置的
Content-Length,让ASP.NET框架自动处理响应长度 - 检查并修正所有自定义头部,确保名称为小写
- 避免同时启用分块编码和固定内容长度的配置
2. 排查流式响应/长连接处理问题
如果该页面是流式输出(如大文件下载、实时数据推送),HTTP/2的流处理逻辑与HTTP/1.1存在差异,Azure代理可能因超时或未正确关闭流而强制断开连接:
解决方式:
- 为响应设置合理的
Response.Timeout值,避免1秒内触发超时 - 大文件下载场景,直接使用Azure Blob Storage提供下载服务,绕过ASP.NET站点中转
- 检查代码中是否存在未正确关闭的响应流,确保请求完成后释放资源
3. 升级.NET运行时版本
旧版本的.NET框架(尤其是.NET Core 3.1及更早版本)存在部分HTTP/2兼容性bug,可能导致特定场景下的连接重置:
解决方式:
- 将.NET运行时升级到对应分支的最新稳定版本(如.NET 6/7/8的最新补丁版)
- 检查web.config中是否存在与HTTP/2冲突的自定义配置,移除无效的HTTP协议相关设置
4. 检查Azure App Service代理与SSL配置
Azure App Service的前端代理对HTTP/2有特定要求,若配置不符合规范会导致连接异常:
解决方式:
- 确认站点使用的SSL证书是TLS 1.2及以上版本(HTTP/2不支持旧版SSL协议)
- 在Azure门户的App Service「配置」→「常规设置」中,检查HTTP版本设置是否正确启用HTTP/2
- 若使用了Application Gateway等额外代理,确认其HTTP/2转发配置是否正确
5. 启用Azure详细诊断日志
通过Azure的诊断日志可以获取代理层的错误信息,定位连接重置的具体原因:
操作步骤:
- 进入Azure门户的App Service控制台,打开「诊断和解决问题」→「日志」
- 启用「Web服务器日志」和「详细错误日志」
- 重新触发页面请求,查看日志中是否有HTTP/2相关的错误提示(如流超时、头部校验失败等)
内容的提问来源于stack exchange,提问作者Bouke
相关产品推荐
相关产品推荐

