. net 4.6 HttpResponse.PushPromise方法管理http/2的PUSH_PROMISE报头

本文关键字:PUSH 报头 PROMISE http HttpResponse PushPromise 管理 方法 net | 更新日期: 2023-09-27 18:04:08

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

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

接受资源public void PushPromise(string path)的路径-假设资源随后被读取并二进制发送到客户端。

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

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

. net 4.6 HttpResponse.PushPromise方法管理http/2的PUSH_PROMISE报头

从阅读HTTP/2规范(第8.2节)中,我收集到以下内容:

传递方法

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

通过标题

由于PUSH_PROMISE帧被要求是可缓存的,这可以用来添加特定的Cache-Control指令到承诺。规范的8.2.2节指出,客户端可以选择下载承诺的流,也可以拒绝它,我想如果客户端发现它的缓存中有一个最新版本的资源,它就会这样做。

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

你会想要传递任何会导致你的响应变化的头(即任何在你的变化响应头)。我发现最大的问题是压缩。

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

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