.NET 4.6 HttpResponse.PushPromise 管理方法 http/2 PUSH_PROMISE header

.NET 4.6 HttpResponse.PushPromise methods to manage http/2 PUSH_PROMISE header

我对 PUSH PROMISE http/2 header 在 .NET4.6 中的处理有点困惑。

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 methodNameValueCollection headers

为什么我要传递方法(假设 HttpMethod 像 GET、POST 等)和 header 中的 collection PUSH PROMISE header?

通过阅读 HTTP/2 spec (Section 8.2),以下是我收集的内容:

传递方法

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

通过 headers

由于 PUSH_PROMISE 帧需要可缓存,这可用于向承诺添加特定的 Cache-Control 指令。 Section 8.2.2 of the spec 声明客户端可以选择下载承诺的流并可以拒绝它,我想如果客户端发现它的缓存中有 up-to-date 版本的资源,它会这样做。

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

对于任何会导致您的响应发生变化的内容(即您的 Vary 响应 header 中的任何内容),您都需要传递 headers。我发现最大的一个是压缩。

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

var headers = new NameValueCollection { { "accept-encoding", this.Request.Headers["accept-encoding"] } };
this.Response.PushPromise("~/Scripts/jquery.js", "GET", headers);`