http - ASP.NET 核心:HTTP HEAD 请求和 Content-Length 标头
问题描述
这个问题与一个 ASP.NET 核心 2.2 Web 应用程序(以 .NET 核心为目标)有关,该应用程序公开了一些使用 mvc 中间件实现的 Web api 控制器。所有控制器中可用的所有操作方法都必须响应 GET 和 HEAD http 方法。
我们注意到 ASP.NET 核心会自动添加Transfer-Encoding
带有值的标头,chunked
并根据规范省略Content-Length
标头(有关更多详细信息,请参阅此 MDN 页面)。
根据ASP.NET 核心存储库上的这个 github 问题,这种行为似乎取决于 Kestrel Web 服务器的精确设计决策,因此这是预期的行为。
也就是说,每次我们向应用程序的任何路由发出 HEAD 请求时,我们都会得到一个将Content-Length
标头设置为 0 的响应,即使相应的 GET 请求(我的意思是具有相同路径的 GET 请求)返回一个非空响应体.
根据我在各种来源上阅读的内容,似乎Content-Length
对于 HEAD 请求的响应,标头不是强制性的,但是当包含它时,它应该与相应的 GET 请求具有相同的值。所以0
我们在每个 HEAD 请求上看到的值对我来说似乎并不正确。
对于相应的 GET 请求,ASP.NET 核心通过使用块发送响应(如上所述Transfer-Encoding
总是chunked
针对 GET 请求),这是一个副作用吗?
另一个疑问与向我们的应用程序发出 HEAD 请求以决定是否清除缓存响应的任何类型的缓存有关:零值 Content-Length 是否会对缓存行为的正确性造成风险?
2018 年 3 月 27 日编辑
我们重复了测试,得到了不同但更有意义的结果。我可以确认 GET 和 HEAD 请求都没有发送任何 Content-Length 标头。这绝对是有道理的,因为响应主体总是按块传输到客户端,如上所述。
也就是说,我认为 ASP.NET 核心行为对我来说绝对有意义。
解决方案
推荐阅读
- python - 使用 Python 在 Windows 上的“psutil.boot_time()”中启动时间不正确?
- javascript - 在页面更改时添加单个组件转换到 nuxt 组件的最佳方法?
- php - Laravel中雄辩关系中的Where子句
- java - 如何在spring boot中读取excel文件
- ios - 应用程序不支持模拟器架构
- python - 尝试使用字典来验证状态 2 字母缩写
- python - 如何以编程方式保存 Spyder Plots 面板中显示的图像?
- javascript - 如何处理折叠菜单中常用功能的切换状态?
- ios - Swift IBOutlet 是 nil 但它是连接的故事板
- javascript - 是否有正确的方法来处理 Nodejs 中的流错误