.NET 4.6 HttpResponse.PushPromise 方法来管理 http/2 PUSH_PROMISE 标头
Posted
技术标签:
【中文标题】.NET 4.6 HttpResponse.PushPromise 方法来管理 http/2 PUSH_PROMISE 标头【英文标题】:.NET 4.6 HttpResponse.PushPromise methods to manage http/2 PUSH_PROMISE header 【发布时间】:2015-10-12 14:21:38 【问题描述】:我对@987654327@ 中的PUSH PROMISE http/2 标头处理有点困惑。
When I lookHttpResponse.PushPromise
有两个重载:
One that accepts path to resource public void PushPromise(string path)
- 我假设资源被读取并将二进制发送到客户端。
Second public void PushPromise(string path, string method, NameValueCollection headers)
接受 sting method
和 NameValueCollection headers
,我无法理解。
我为什么要在PUSH PROMISE
标头中传递方法(假设 HttpMethod 像 GET、POST 等)和标头集合?
【问题讨论】:
MS 文档确实为此感到震惊!甚至没有代码示例 他们在源代码本身中有更好的文档github.com/Microsoft/referencesource/blob/master/System.Web/…(搜索“PushPromise”) @Simon_Weaver 谢谢西蒙,非常感谢。 那里更好... 【参考方案1】:通过阅读 HTTP/2 spec (Section 8.2),我收集到以下信息:
传递方法
PUSH_PROMISE
帧需要可缓存和安全。您可以选择使用GET
和HEAD
,因为它们是唯一被定义为安全和可缓存的两种http 方法。
传递标题
由于要求PUSH_PROMISE
帧是可缓存的,这可用于向承诺添加特定的Cache-Control
指令。 Section 8.2.2 of the spec 表示客户端可以选择下载承诺的流并且可以拒绝它,我想如果客户端发现它的缓存中有最新版本的资源,它会这样做。
控制缓存是我可以看到的最明显的原因,您可能会传递标头,但也可能有其他原因。如果您正在编写自定义客户端,您可以使用某些 X-Headers 向客户端提供其他提示(与缓存无关),以便它可以决定是否要接受承诺的流。
【讨论】:
【参考方案2】:您需要传递任何会导致您的响应发生变化的标头(即您的 Vary 响应标头中的任何内容)。我发现最大的一个是压缩。
从原始客户端请求中读取这些标头并将它们包含在您的推送承诺中,例如:
var headers = new NameValueCollection "accept-encoding", this.Request.Headers["accept-encoding"] ;
this.Response.PushPromise("~/Scripts/jquery.js", "GET", headers);`
【讨论】:
我不相信这一点。我认为只有当文件的 contents 会根据特定的标头而变化时,您才会在此处添加标头。未压缩文件的内容永远不会改变,所以这没有任何用处。我认为需要指定headers
是一个非常特殊的情况,大多数人不必担心。也许如果文件的 content 因浏览器的语言而异,那么您会使用它,但显然jquery.js
在这里是一个静态文件,因此内容不会改变。如果文件是基于语言的动态文件,您可以使用它。以上是关于.NET 4.6 HttpResponse.PushPromise 方法来管理 http/2 PUSH_PROMISE 标头的主要内容,如果未能解决你的问题,请参考以下文章
已安装 4.6 时如何满足 .Net Framework 4.0 要求
.NET 4.6 的 Task.CompletedTask 有啥意义?
.NET 4.6 中的 OpenIddict 3 不可用令牌验证