.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 method
和 NameValueCollection headers
。
为什么我要传递方法(假设 HttpMethod 像 GET、POST 等)和 header 中的 collection PUSH PROMISE
header?
通过阅读 HTTP/2 spec (Section 8.2),以下是我收集的内容:
传递方法
PUSH_PROMISE
帧需要 可缓存 和 安全 。您可以选择使用 GET
和 HEAD
,因为它们是仅有的两个被定义为既安全又可缓存的 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);`
我对 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 method
和 NameValueCollection headers
。
为什么我要传递方法(假设 HttpMethod 像 GET、POST 等)和 header 中的 collection PUSH PROMISE
header?
通过阅读 HTTP/2 spec (Section 8.2),以下是我收集的内容:
传递方法
PUSH_PROMISE
帧需要 可缓存 和 安全 。您可以选择使用 GET
和 HEAD
,因为它们是仅有的两个被定义为既安全又可缓存的 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);`