Udostępnij za pośrednictwem


Używanie ASP.NET Core z protokołem HTTP/2 w usługach IIS

Autor: Justin Kotalik

Protokół HTTP/2 jest obsługiwany w przypadku ASP.NET Core w następujących scenariuszach wdrażania usług IIS:

  • Windows Server 2016 lub nowszy / Windows 10 lub nowszy
  • Usługi IIS 10 lub nowsze
  • Połączenie TLS 1.2 lub nowsze
  • W przypadku hostowania poza procesem: połączenia z serwerem brzegowym dostępnym publicznie używają protokołu HTTP/2, ale odwrotne połączenie serwera proxy z Kestrel serwerem korzysta z protokołu HTTP/1.1.

W przypadku wdrożenia wewnątrz procesu po nawiązaniu połączenia HTTP/2 HttpRequest.Protocol zgłasza HTTP/2. W przypadku wdrożenia poza procesem podczas nawiązywania połączenia HTTP/2 HttpRequest.Protocol zgłasza HTTP/1.1.

Aby uzyskać więcej informacji na temat modeli hostingu wewnątrz procesu i poza procesem, zobacz Moduł ASP.NET Core Module (ANCM) dla usług IIS.

Protokół HTTP/2 jest domyślnie włączony dla połączeń HTTPS/TLS. Połączenia wracają do używania protokołu HTTP/1.1, jeśli połączenie HTTP/2 nie zostało nawiązane. Aby uzyskać więcej informacji na temat konfiguracji protokołu HTTP/2 z wdrożeniami usług IIS, zobacz HTTP/2 w usługach IIS.

Zaawansowane funkcje HTTP/2 do obsługi gRPC

Dodatkowe funkcje HTTP/2 w usługach IIS obsługują gRPC, w tym obsługę przyczep odpowiedzi i wysyłanie ramek resetowania.

Wymagania dotyczące uruchamiania usługi gRPC w usługach IIS:

  • Hosting w procesie.
  • Windows 11 Build 22000 lub nowszy, Windows Server 2022 Build 20348 lub nowszy.
  • Połączenie TLS 1.2 lub nowsze.

Przyczepy

Przyczepy HTTP są podobne do nagłówków HTTP, z wyjątkiem wysyłanych po wysłaniu treści odpowiedzi. W przypadku usług IIS i HTTP.sys obsługiwane są tylko przyczepy odpowiedzi HTTP/2.

if (httpContext.Response.SupportsTrailers())
{
    httpContext.Response.DeclareTrailer("trailername");	

    // Write body
    httpContext.Response.WriteAsync("Hello world");

    httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}

W poprzednim przykładowym kodzie:

  • SupportsTrailers zapewnia, że przyczepy są obsługiwane w odpowiedzi.
  • DeclareTrailer dodaje daną nazwę przyczepy do nagłówka Trailer odpowiedzi. Deklarowanie przyczep odpowiedzi jest opcjonalne, ale zalecane. Jeśli DeclareTrailer jest wywoływana, musi to być przed wysłaniem nagłówków odpowiedzi.
  • AppendTrailer dołącza przyczepę.

Reset

Resetowanie umożliwia serwerowi zresetowanie żądania HTTP/2 z określonym kodem błędu. Żądanie resetowania jest uznawane za przerwane.

var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);

Reset w poprzednim przykładzie kodu określa kod błędu INTERNAL_ERROR . Aby uzyskać więcej informacji na temat kodów błędów HTTP/2, odwiedź sekcję kod błędu specyfikacji HTTP/2.