1

我对PUSH PROMISE http/2标头处理有点困惑.NET4.6

当我查看 HttpResponse.PushPromise时,有两个重载:

一种接受资源路径的方法 public void PushPromise(string path)-假设然后读取资源并将二进制文件发送给客户端。

第二个 public void PushPromise(string path, string method, NameValueCollection headers)接受sting method并且NameValueCollection headers我无法理解。

为什么我要传递方法(假设像 GET、POST 等这样的 HttpMethod)和标题内的PUSH PROMISE标题集合?

4

2 回答 2

3

通过阅读 HTTP/2规范(第 8.2 节),我收集到以下信息:

传递方法

PUSH_PROMISE帧需要可缓存安全。您可以选择使用GETand HEAD,因为它们是仅有的两个被定义为既安全又可缓存的 http 方法。

传递标头

由于PUSH_PROMISE帧需要是可缓存的,这可以用于向 Promise 添加特定Cache-Control的指令。规范的第 8.2.2 节指出,客户端可以选择下载承诺的流并且可以拒绝它,我想如果客户端发现它的缓存中有最新版本的资源,它会这样做.

控制缓存是我可以看到的最明显的原因,您可能会传递标头,但也可能有其他原因。如果您正在编写自定义客户端,您可以使用某些 X-Headers 向客户端提供其他提示(与缓存无关),以便它可以决定是否要接受承诺的流。

于 2015-07-22T16:30:42.277 回答
0

您需要为任何会导致您的响应变化的内容(即您的 Vary 响应标头中的任何内容)传递标头。我发现最大的一个是压缩。

从原始客户端请求中读取这些标头,并将它们包含在您的推送承诺中,例如:

var headers = new NameValueCollection { { "accept-encoding", this.Request.Headers["accept-encoding"] } };
this.Response.PushPromise("~/Scripts/jquery.js", "GET", headers);`
于 2016-08-03T22:33:47.727 回答