.NET 4.6 HttpResponse.PushPromise方法来管理http / 2 PUSH_PROMISE标头

时间:2015-07-22 15:34:23

标签: c# http2 .net-4.6 push-promise

我对.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 methodNameValueCollection headers

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

2 个答案:

答案 0 :(得分:2)

从阅读HTTP / 2 spec (Section 8.2),这是我收集的内容:

传递方法

PUSH_PROMISE帧必须可缓存安全。您可以选择使用GETHEAD,因为它们是唯一定义为安全和可缓存的两种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);`