. net 4.6 HttpResponse.PushPromise方法管理http/2的PUSH_PROMISE报头
本文关键字:PUSH 报头 PROMISE http HttpResponse PushPromise 管理 方法 net | 更新日期: 2023-09-27 18:04:08
我对.NET4.6
中的PUSH PROMISE http/2报头处理有点困惑。
当我查看HttpResponse.PushPromise
时,有两个重载:
接受资源public void PushPromise(string path)
的路径-假设资源随后被读取并二进制发送到客户端。
第二个接受sting method
和NameValueCollection headers
的public void PushPromise(string path, string method, NameValueCollection headers)
,我无法理解。
为什么我要传递方法(假设HttpMethod如GET, POST等)和PUSH PROMISE
头内的头集合?
从阅读HTTP/2规范(第8.2节)中,我收集到以下内容:
传递方法
PUSH_PROMISE
帧需要可缓存和安全。您可以选择使用GET
和HEAD
,因为这是唯一两个被定义为既安全又可缓存的http方法。
通过标题
由于PUSH_PROMISE
帧被要求是可缓存的,这可以用来添加特定的Cache-Control
指令到承诺。规范的8.2.2节指出,客户端可以选择下载承诺的流,也可以拒绝它,我想如果客户端发现它的缓存中有一个最新版本的资源,它就会这样做。
控制缓存是最明显的原因,我可以看到为什么你可能会传递头,但也可能有其他原因。如果你正在编写自定义客户端,你可以使用特定的X-Headers向客户端提供其他提示(与缓存无关),以便它可以决定是否要接受承诺的流。
你会想要传递任何会导致你的响应变化的头(即任何在你的变化响应头)。我发现最大的问题是压缩。
从原始客户端请求中读取这些报头,并将它们包含在你的推送承诺中,例如:
var headers = new NameValueCollection { { "accept-encoding", this.Request.Headers["accept-encoding"] } };
this.Response.PushPromise("~/Scripts/jquery.js", "GET", headers);`