在哪里调用 ASP.Net HTTP2 PushPromise

Posted

技术标签:

【中文标题】在哪里调用 ASP.Net HTTP2 PushPromise【英文标题】:Where to call ASP.Net HTTP2 PushPromise 【发布时间】:2017-11-03 23:49:42 【问题描述】:

我们正在将我们的 ASP.Net (4.6) Web Forms 网站迁移到全新的 2016 服务器,作为其中的一部分,我们渴望充分利用新的 HTTP2 可能性。其中一部分是使用服务器推送来尽快将 css 和 js 文件发送到客户端。但是,在网上基本上找到了 zero 文档(如果我错了,请纠正我)我正在努力检查调用 HttpResponse.PushPromise() 方法的最佳位置。

在标准页面上,我假设这只会放在 Page_Load() 中?但是,该项目中的大多数页面实际上都派生自 BasePage 类而不是 System.Web.UI.Page(基本上只是为了提供常用方法和自定义属性),所以这里的最佳实践案例是什么。我们应该覆盖 Page_Load 吗? 或者从应用程序的其他地方调用 PushPromise()?

感谢您提供的任何帮助。我知道 HTTP2 是相当新的,但我发现微软在这方面缺乏文档/支持/示例真的很糟糕。

非常感谢!

【问题讨论】:

似乎最好的解决方案实际上是一个 Http 模块,它只监视请求及其通常的后续操作,并且有点智能地为您插入 PushPromise() 调用,而不必编写您的拥有。 【参考方案1】:

对于诸如此类的新事物,我不确定是否存在“最佳实践”。这里有一些文档:

https://docs.microsoft.com/en-us/dotnet/api/system.web.httpresponsebase.pushpromise?view=netframework-4.7

这包括对规范的引用。

我对 HTTP/2 真的不太了解,但这似乎有一些适用于标头的相同规则,例如在发送正文后您可能无法推送,所以您的可能必须在管道的早期阶段发出命令。

【讨论】:

谢谢 Erik - 这也是我能找到的唯一文档,但我想你会同意它是非常简单的?我同意适用于标题的相同规则可能是正确的,但我一直希望我不是第一个在“现实世界”中实际使用它的人,并且有一些实际的代码示例浮动在某个地方……? @DanClarke - 部分问题在于绝大多数人无法使用 HTTP/2,因此在记录它上花费的精力更少。此外,微软生态系统内的实施尚未完成,因此很多人都在采取“观望”的方式。 我不知道 Erik... 从今天看,Caniuse 有 81% 的全球用户能够使用 http2 (caniuse.com/#search=http2),而 KeyCDN 表示,到今年 4 月,他们处理了 68% 的 https 请求通过 HTTP2 (keycdn.com/blog/http2-statistics)。它不再是小众市场了。 @DanClarke - 我应该更清楚。当我说“绝大多数人”时,我指的是 .NET 开发人员。大多数人仍在使用 .NET 4.6 或 4.5。即使在 4.7 中,对 HTTP/2 的支持仍然很差。【参考方案2】:

只是为了对此进行更新:我们最初尝试将 PushPromise 放入 BasePage 类的 Page_Load() 事件中,但遇到了一些问题。我们不能 100% 确定是这样,但 IIS 工作进程在实施后经常崩溃。同时还有其他一些小的代码更改,我们回滚了整个代码,但使用 Chrome 的用户也间歇性地报告 ERR_SPDY_PROTOCOL_ERROR,这似乎也表明这是问题所在。

我们将尝试在 Application_BeginRequest() 的 HttpModule 中实现它,以便我们看看这是否更可靠。

【讨论】:

【参考方案3】:

从技术上讲,您可以在任何地方发送响应。

服务器为响应部分创建 PUSH_PROMISE 帧 正常的,浏览器启动的流

由于您调用的是响应对象,因此您必须有可用的响应对象(在具有 HTTP 连接的请求的上下文中。

public partial class Default : System.Web.UI.Page
    
        protected void Page_Load(object sender, EventArgs e)
        
            Response.PushPromise("/Images/1.png");                  
        
    

我已经完成了关于 HTTP 基础知识的第 9 频道演示以及它给here 带来的所有好处。它还包含一个 HTTP 推送承诺的演示,以及它在网络跟踪级别的工作方式。我还有一个完整的演示代码在this github repo

【讨论】:

以上是关于在哪里调用 ASP.Net HTTP2 PushPromise的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 和 Neo4jClient - 在哪里存储连接?

.NET 上的 HTTP/2(HTTP2 或 SPDY)

在 asp.net 中的 AJAX 调用未命中成功事件

asp.net core 3.0 gRPC框架小试

Asp.net中a标签调用js的函数

ASP.NET Core 中的异步延续在哪里排队?