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

能否在ASP.NET Core控制器发送HTTP_1_1_REQUIRED要求客户端降级HTTP版本?

在ASP.NET Core控制器中触发HTTP/2到HTTP/1.1的降级

可以在控制器中引导客户端降级到HTTP/1.1,但直接发送HTTP_1_1_REQUIRED并不是标准HTTP响应的一部分,你需要通过标准的HTTP状态码和响应头来实现。

控制器内的实现方式

你可以返回426 Upgrade Required状态码,并在响应头中指定要求使用HTTP/1.1,示例代码如下:

[HttpGet]
public IActionResult ForceProtocolDowngrade()
{
    Response.Headers.Add("Upgrade", "HTTP/1.1");
    Response.Headers.Add("Connection", "Upgrade");
    return StatusCode(StatusCodes.Status426UpgradeRequired);
}

不过要注意:这种方式的效果依赖客户端实现——并非所有HTTP/2客户端都会自动断开连接并改用HTTP/1.1重新请求,需要客户端支持这种降级逻辑。

关于HttpReceiveClientCertificate的降级逻辑

你提到的这个场景是在HTTP/2连接建立之前的TLS握手阶段处理的,属于Kestrel服务器的底层逻辑。当服务器要求客户端提供证书但未收到时,Kestrel会直接拒绝HTTP/2连接,并告知客户端改用HTTP/1.1发起请求。这种降级是在协议协商层面的强制操作,比控制器层面的响应更直接,因为它在请求到达应用层(控制器)之前就截断了HTTP/2连接。

控制器层面降级的局限性

控制器代码只有在HTTP/2连接完全建立、请求已经到达应用层后才会执行。这意味着此时HTTP/2的连接协商已经完成,你返回的426响应是在现有HTTP/2连接内发送的,客户端需要主动配合才能完成降级。如果需要更可靠的强制降级,建议在Kestrel配置或自定义中间件层面处理,在请求到达控制器之前就触发底层的协议降级逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:56:03