我对.NET4.6
中的PUSH PROMISE http/2标头处理感到有点困惑。
When I look HttpResponse.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
。
为什么我要传递方法(假设像GET,POST等HttpMethod)和PUSH PROMISE
标题内的标题集合?
答案 0 :(得分:2)
从阅读HTTP / 2 spec (Section 8.2),这是我收集的内容:
PUSH_PROMISE
帧必须可缓存和安全。您可以选择使用GET
和HEAD
,因为它们是唯一定义为安全和可缓存的两种http方法。
由于PUSH_PROMISE
帧需要可缓存,因此可以使用此特定的Cache-Control
指令添加到promise中。 Section 8.2.2 of the spec声明客户端可以选择下载承诺的流并且可以拒绝它,我想如果客户端发现它的缓存中有最新版本的资源,我会这样做。 / p>
控制缓存是我可以看到为什么你可以传递标题的最明显的原因,但也可能有其他原因。如果您正在编写自定义客户端,您可以使用某些X-Header向客户端提供其他提示(与缓存无关),以便它可以决定是否要接受承诺的流
答案 1 :(得分:0)
您希望为任何会导致您的响应变化的内容(即您的Vary响应标头中的任何内容)传递标头。我发现的最大的一个是压缩。
从原始客户端请求中读取这些标头,并将其包含在您的推送承诺中,例如:
var headers = new NameValueCollection { { "accept-encoding", this.Request.Headers["accept-encoding"] } };
this.Response.PushPromise("~/Scripts/jquery.js", "GET", headers);`