ASP.Net HTTP2 PushPromise работает медленно
Я пытаюсь реализовать функциональность push-сервера Http2, используя "PushPromise" .NET 4.6.1, для этого у меня есть "расширение html" с Razor (мы не реализовывали MVC, только использовали движок Razor для создания страниц).
public static IHtmlString PushPromiseStylesheet(this HtmlHelper htmlHelper, string src, bool addDomElement = true)
{
var context = HttpContext.Current;
var path = System.Web.Optimization.Styles.Url(src).ToString();
var headers = new NameValueCollection { { "accept-encoding", context.Request.Headers["accept-encoding"] } };
context.Response.PushPromise(path, "GET", headers);
var styleElement = $"<link rel=\"preload\" href=\"{path}\" as=\"style\">";
return new HtmlString(addDomElement ? styleElement : String.Empty);
}
public static IHtmlString PushPromiseJavascript(this HtmlHelper htmlHelper, string src)
{
var context = HttpContext.Current;
var path = System.Web.Optimization.Scripts.Url(src).ToString();
var headers = new NameValueCollection { { "accept-encoding", context.Request.Headers["accept-encoding"] } };
context.Response.PushPromise(path,"GET",headers);
var javascriptElement = $"<link rel=\"preload\" href=\"{path}\" as=\"script\">";
return new HtmlString(javascriptElement);
}
public static IHtmlString PushPromiseImage(this HtmlHelper htmlHelper, string src, bool addDomElement = false)
{
var context = HttpContext.Current;
var path = System.Web.Optimization.Scripts.Url(src).ToString();
var headers = new NameValueCollection { { "accept-encoding", context.Request.Headers["accept-encoding"] } };
context.Response.PushPromise(path,"GET",headers);
var imgElement = $"<link rel=\"preload\" href=\"{path}\">";
return new HtmlString(addDomElement ? imgElement : String.Empty);
}
public static IHtmlString PushPromiseWebFont(this HtmlHelper htmlHelper, string src, string type = null)
{
var context = HttpContext.Current;
var path = System.Web.Optimization.Scripts.Url(src).ToString();
type = string.IsNullOrWhiteSpace(type) ? "font/woff2" : type;
var headers = new NameValueCollection { { "accept-encoding", context.Request.Headers["accept-encoding"] } };
context.Response.PushPromise(path, "GET", headers);
var fontElement = $"<link rel=\"preload\" href=\"{path}\" as=\"font\" type=\"{type}\"> ";
return new HtmlString(fontElement);
}
И в
страницы:<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<title>@Page.Title</title>
@Html.PushPromiseStylesheet("~/css/app/fonts.css")
@Html.PushPromiseStylesheet("~/css/landing.base.css")
@Html.PushPromiseStylesheet("~/css/landing.style.css")
@Html.PushPromiseImage("/assets/img/bg-ofertas.jpg")
@Html.PushPromiseImage("/assets/img/landings/v2/iphone.png")
@Html.PushPromiseImage("/assets/img/landings/v2/ipad-new.png")
@Html.PushPromiseImage("/assets/img/landings/v2/macbook-new.png")
@Html.PushPromiseWebFont("/assets/fonts/CredimejoraIcons.woff2?miydpz")
@Html.PushPromiseWebFont("/assets/fonts/centrale_sans_regular_italic-webfont.woff2")
@Html.PushPromiseWebFont("/assets/fonts/centrale_sans_bold_italic-webfont.woff2")
@Html.PushPromiseWebFont("/assets/fonts/centrale_sans_regular-webfont.woff2")
@Html.PushPromiseWebFont("/assets/fonts/centrale_sans_bold-webfont.woff2")
@Html.PushPromiseJavascript("/assets/js/public/libs/jquery.inputmask.bundle-3.3.6.2.js")
Я принимал тот же проект "без использования PushPromise" (credimejorademo), а в другом домене я реализовал PushPromise (aquituinmueble):
1 ответ
Просто пару вещей, которые я бы упомянул здесь. Во-первых, хотя это может показаться нелогичным, вам, вероятно, лучше не толкать все. Ограниченное количество тестирований, которое я видел (например: https://www.smashingmagazine.com/2017/04/guide-http2-server-push/), предполагает, что использование только css - это, вероятно, лучший способ улучшить производительность, хотя это стоит поиграть на индивидуальном сайте.
Другое дело, что способ реализации PushPromise означает, что IIS получает этот запрос только после того, как он уже начал обрабатывать страницу. то есть вы запрашиваете отправку более или менее в то же время, когда страница запрашивала бы его через стандарт.
Надеюсь это поможет.