ASP.NET Core'da HTTP.sys web sunucusu uygulaması

Tarafından Tom Dykstra ve Chris Ross

HTTP.sys, ASP.NET Core için yalnızca Windows üzerinde çalışan bir web sunucusudur. HTTP.sys, sunucuya Kestrel alternatiftir ve sağlamayan Kestrel bazı özellikler sunar.

Önemli

HTTP.sys, ASP.NET Core Modülü ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.

HTTP.sys aşağıdaki özellikleri destekler:

  • Windows Kimlik Doğrulaması
  • Bağlantı noktası paylaşma
  • SNI ile HTTPS
  • TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
  • Doğrudan dosya iletimi
  • Yanıtları Önbelleğe Alma
  • WebSockets (Windows 8 veya üzeri)

Desteklenen Windows sürümleri:

  • Windows 7 veya üzeri
  • Windows Server 2008 R2 veya üzeri

Örnek kodu görüntüleme veya indirme (indirme)

HTTP.sys ne zaman kullanılır?

HTTP.sys, aşağıdaki durumlarda dağıtımlar için kullanışlıdır:

  • IIS kullanmadan sunucuyu doğrudan İnternet'te kullanıma sunmanız gerekir.

    HTTP.sys communicates directly with the Internet

  • İç dağıtım, içinde Kestrelkullanılamayan bir özellik gerektirir. Daha fazla bilgi için bkz Kestrel . VS. HTTP.sys

    HTTP.sys communicates directly with the internal network

HTTP.sys, birçok saldırı türüne karşı koruma sağlayan ve tam özellikli bir web sunucusunun sağlamlığını, güvenliğini ve ölçeklenebilirliğini sağlayan olgun bir teknolojidir. IIS'nin kendisi, HTTP.sys dosyasının üzerinde bir HTTP dinleyicisi olarak çalışır.

HTTP/2 desteği

HTTP/2 , aşağıdaki temel gereksinimler karşılandığında ASP.NET Core uygulamaları için etkinleştirilir:

HTTP/2 bağlantısı kuruluyorsa HttpRequest.ProtocolHTTP/2 bildirir.

HTTP/2 varsayılan olarak etkinleştirilir. HTTP/2 bağlantısı kurulmazsa, bağlantı HTTP/1.1'e geri döner. Windows'un gelecekteki bir sürümünde, HTTP/2'yi HTTP.sys ile devre dışı bırakma özelliği de dahil olmak üzere HTTP/2 yapılandırma bayrakları kullanılabilir olacaktır.

HTTP/3 desteği

HTTP/3 , aşağıdaki temel gereksinimler karşılandığında ASP.NET Core uygulamaları için etkinleştirilir:

Önceki Windows 11 Derleme sürümleri bir Windows Insider derlemesinin kullanılmasını gerektirebilir.

HTTP/3, üst bilgi aracılığıyla alt-svc HTTP/1.1 veya HTTP/2'den yükseltme olarak bulunur. Bu, ilk isteğin HTTP/3'e geçmeden önce normalde HTTP/1.1 veya HTTP/2 kullanacağı anlamına gelir. Http.Sys üst bilgiyi otomatik olarak eklemez alt-svc , uygulama tarafından eklenmesi gerekir. Aşağıdaki kod, yanıt üst bilgisini ekleyen alt-svc bir ara yazılım örneğidir.

app.Use((context, next) =>
{
    context.Response.Headers.AltSvc = "h3=\":443\"";
    return next(context);
});

Yukarıdaki kodu istek işlem hattının başına yerleştirin.

Http.Sys, istemciye HTTP/3'ün kullanılabilir olduğunu bildirmek için yanıt üst bilgisi yerine AltSvc HTTP/2 protokol iletisi göndermeyi de destekler. Bkz. EnableAltSvc kayıt defteri anahtarı. Bunun için IP adresleri yerine konak adlarını kullanan netsh sslcert bağlamaları gerekir.

Kerberos ile çekirdek modu kimlik doğrulaması

HTTP.sys, Kerberos kimlik doğrulama protokolüyle çekirdek modu kimlik doğrulamasını temsil eder. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.

Çekirdek modu yanıt arabelleği desteği

Bazı senaryolarda, yüksek gecikme süresine sahip yüksek hacimli küçük yazma işlemleri üzerinde önemli performans etkisine HTTP.sysneden olabilir. Bu etki, uygulamada arabellek Pipe olmamasından HTTP.sys kaynaklanır. Bu senaryolarda performansı geliştirmek için yanıt arabelleği desteğine HTTP.sysdahil edilir. HttpSysOptions.EnableKernelResponseBuffering ayarını olarak trueayarlayarak arabelleğe almayı etkinleştirin.

Yanıt arabelleği, zaman uyumlu G/Ç veya bir kerede birden fazla bekleyen yazma olmayan zaman uyumsuz G/Ç kullanan bir uygulama tarafından etkinleştirilmelidir. Bu senaryolarda yanıt arabelleği oluşturma, yüksek gecikme süreli bağlantılarda aktarım hızını önemli ölçüde iyileştirebilir.

Zaman uyumsuz G/Ç kullanan ve aynı anda birden fazla yazma işlemi bekleyen uygulamalar bu bayrağı kullanmamalıdır. Bu bayrağın etkinleştirilmesi HTTP.Sys tarafından daha yüksek CPU ve bellek kullanımına neden olabilir.

HTTP.sys kullanma

ASP.NET Core uygulamasını HTTP.sys kullanacak şekilde yapılandırma

Konağı UseHttpSys oluştururken gerekli HttpSysOptionsolan herhangi bir öğesini belirterek uzantı yöntemini çağırın. Aşağıdaki örnek, seçenekleri varsayılan değerlerine ayarlar:

using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseHttpSys(options =>
{
    options.AllowSynchronousIO = false;
    options.Authentication.Schemes = AuthenticationSchemes.None;
    options.Authentication.AllowAnonymous = true;
    options.MaxConnections = null;
    options.MaxRequestBodySize = 30_000_000;
    options.UrlPrefixes.Add("http://localhost:5005");
});

builder.Services.AddRazorPages();

var app = builder.Build();

Ek HTTP.sys yapılandırması kayıt defteri ayarları aracılığıyla işlenir.

HTTP.sys seçenekleri hakkında daha fazla bilgi için bkz HttpSysOptions. .

MaxRequestBodySize

Bayt cinsinden herhangi bir istek gövdesinin izin verilen en büyük boyutu. olarak nullayarlandığında, istek gövdesi boyutu üst sınırı sınırsızdır. Bu sınırın, her zaman sınırsız olan yükseltilmiş bağlantılar üzerinde hiçbir etkisi yoktur.

Tek bir ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için IActionResult önerilen yöntem, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Uygulama isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa bir özel durum oluşur. Özelliğin IsReadOnlyMaxRequestBodySize salt okunur durumda olup olmadığını belirtmek için bir özellik kullanılabilir; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.

Uygulamanın istek başına geçersiz kılması MaxRequestBodySize gerekiyorsa kullanın IHttpMaxRequestBodySizeFeature:

app.Use((context, next) =>
{
    context.Features.GetRequiredFeature<IHttpMaxRequestBodySizeFeature>()
                                             .MaxRequestBodySize = 10 * 1024;

    var server = context.RequestServices
        .GetRequiredService<IServer>();
    var serverAddressesFeature = server.Features
                                 .GetRequiredFeature<IServerAddressesFeature>();

    var addresses = string.Join(", ", serverAddressesFeature.Addresses);

    var loggerFactory = context.RequestServices
        .GetRequiredService<ILoggerFactory>();
    var logger = loggerFactory.CreateLogger("Sample");

    logger.LogInformation("Addresses: {addresses}", addresses);

    return next(context);
});

Visual Studio kullanıyorsanız, uygulamanın IIS veya IIS Express'i çalıştıracak şekilde yapılandırılmadığından emin olun.

Visual Studio'da varsayılan başlatma profili IIS Express içindir. Projeyi konsol uygulaması olarak çalıştırmak için, aşağıdaki ekran görüntüsünde gösterildiği gibi seçili profili el ile değiştirin:

Select console app profile

Windows Server'ı yapılandırma

  1. Uygulama için açılacak bağlantı noktalarını belirleyin ve trafiğin HTTP.sys dosyasına ulaşmasına izin vermek üzere güvenlik duvarı bağlantı noktalarını açmak için Windows Güvenlik Duvarı'nı veya New-NetFirewallRule PowerShell cmdlet'ini kullanın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.

  2. Azure VM'sine dağıtım yaparken Ağ Güvenlik Grubu'ndaki bağlantı noktalarını açın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.

  3. Gerekirse X.509 sertifikalarını alın ve yükleyin.

    Windows'da, New-SelfSignedCertificate PowerShell cmdlet'ini kullanarak otomatik olarak imzalanan sertifikalar oluşturun. Desteklenmeyen bir örnek için bkz . UpdateIISExpressSSLForChrome.ps1.

    Sunucunun Yerel Makine>Kişisel deposuna otomatik olarak imzalanan veya CA imzalı sertifikalar yükleyin.

  4. Uygulama çerçeveye bağımlı bir dağıtımsa .NET Core, .NET Framework veya her ikisini birden yükleyin (uygulama .NET Framework'ü hedefleyen bir .NET Core uygulamasıysa).

    • .NET Core: Uygulama .NET Core gerektiriyorsa .NET Core İndirmeleri'nden .NET Core Çalışma Zamanı yükleyicisini alın ve çalıştırın. Tam SDK'yi sunucuya yüklemeyin.
    • .NET Framework: Uygulama .NET Framework gerektiriyorsa , .NET Framework yükleme kılavuzuna bakın. Gerekli .NET Framework'ü yükleyin. En son .NET Framework yükleyicisine .NET Core İndirmeleri sayfasından ulaşabilirsiniz.

    Uygulama bağımsız bir dağıtımsa, uygulama çalışma zamanını dağıtımına ekler. Sunucuda çerçeve yüklemesi gerekmez.

  5. Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.

    Varsayılan olarak, ASP.NET Core öğesine http://localhost:5000bağlanır. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:

    • UseUrls
    • urls komut satırı bağımsız değişkeni
    • ASPNETCORE_URLS ortam değişkeni
    • UrlPrefixes

    Aşağıdaki kod örneği, 443 numaralı bağlantı noktasında sunucunun yerel IP adresiyle 10.0.0.4 nasıl kullanılacağını UrlPrefixes gösterir:

    var builder = WebApplication.CreateBuilder(args);
    
    builder.WebHost.UseHttpSys(options =>
    {
        options.UrlPrefixes.Add("https://10.0.0.4:443");
    });
    
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    

    Bunun bir avantajı UrlPrefixes , hatalı biçimlendirilmiş ön ekler için hemen bir hata iletisi oluşturulmasıdır.

    Geçersiz kılma/ASPNETCORE_URLSUseUrlsurls/ayarlarındaki UrlPrefixes ayarlar. Bu nedenle, , urlsve ortam değişkeninin UseUrlsASPNETCORE_URLS avantajlarından biri, ve HTTP.sys arasında Kestrel geçişin daha kolay olmasıdır.

    HTTP.sys, HTTP Server API UrlPrefix dize biçimlerini kullanır.

    Uyarı

    En üst düzey joker karakter bağlamaları (http://*:80/ ve http://+:80) kullanılmamalıdır. Üst düzey joker karakter bağlamaları uygulama güvenlik açıkları oluşturur. Bu durum hem güçlü hem de zayıf joker karakterler için geçerlidir. Joker karakterler yerine açık konak adları veya IP adresleri kullanın. Alt etki alanı joker karakter bağlaması (örneğin, *.mysub.com) üst etki alanının tamamını denetlerseniz ( *.comgüvenlik açığı olan yerine) bir güvenlik riski değildir. Daha fazla bilgi için bkz . RFC 9110: Bölüm 7.2: Konak ve :authority.

    Uygulamalara ve kapsayıcılara genellikle konak veya yol gibi ek kısıtlamalar olmadan yalnızca 80 numaralı bağlantı noktası gibi dinlemeleri için bir bağlantı noktası verilir. HTTP_PORTS ve HTTPS_PORTS, ve HTTP.sys sunucuları için Kestrel dinleme bağlantı noktalarını belirten yapılandırma anahtarlarıdır. Bu anahtarlar, veya ASPNETCORE_ ön ekleriyle DOTNET_ tanımlanan ortam değişkenleri olarak belirtilebilir veya gibi appsettings.jsonbaşka bir yapılandırma girişi aracılığıyla doğrudan belirtilebilir. Her biri, aşağıdaki örnekte gösterildiği gibi noktalı virgülle ayrılmış bağlantı noktası değerleri listesidir:

    ASPNETCORE_HTTP_PORTS=80;8080
    ASPNETCORE_HTTPS_PORTS=443;8081
    

    Yukarıdaki örnek, şemayı (HTTP veya HTTPS) ve herhangi bir konağı veya IP'yi belirten aşağıdaki yapılandırmanın kısaltmasıdır.

    ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
    

    HTTP_PORTS ve HTTPS_PORTS yapılandırma anahtarları daha düşük önceliklidir ve doğrudan kodda sağlanan URL'ler veya değerler tarafından geçersiz kılınabilir. Sertifikaların yine de HTTPS için sunucuya özgü mekanikler aracılığıyla ayrı olarak yapılandırılması gerekir.

    Bu yapılandırma anahtarları üst düzey joker karakter bağlamalarına eşdeğerdir. Geliştirme ve kapsayıcı senaryoları için kullanışlıdır, ancak diğer hizmetleri de barındırabilecek bir makinede çalışırken joker karakter kullanmaktan kaçının.

  6. Sunucudaki URL ön eklerini önceden kaydedin.

    HTTP.sys'yi yapılandırmaya yönelik yerleşik araç netsh.exe'dir. netsh.exe , URL ön eklerini ayırmak ve X.509 sertifikaları atamak için kullanılır. Araç yönetici ayrıcalıkları gerektirir.

    Uygulamaya URL'leri kaydetmek için netsh.exe aracını kullanın:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: Tam Tekdüzen Kaynak Bulucu (URL). Joker karakter bağlaması kullanmayın. Geçerli bir ana bilgisayar adı veya yerel IP adresi kullanın. URL sonunda bir eğik çizgi içermelidir.
    • <USER>: Kullanıcı veya kullanıcı grubu adını belirtir.

    Aşağıdaki örnekte, sunucunun yerel IP adresi şöyledir 10.0.0.4:

    netsh http add urlacl url=https://10.0.0.4:443/ user=Users
    

    Bir URL kaydedildiğinde, araç ile URL reservation successfully addedyanıt verir.

    Kayıtlı URL'yi silmek için komutunu delete urlacl kullanın:

    netsh http delete urlacl url=<URL>
    
  7. X.509 sertifikalarını sunucuya kaydedin.

    Uygulamaya sertifika kaydetmek için netsh.exe aracını kullanın:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Bağlama için yerel IP adresini belirtir. Joker karakter bağlaması kullanmayın. Geçerli bir IP adresi kullanın.
    • <PORT>: Bağlamanın bağlantı noktasını belirtir.
    • <THUMBPRINT>: X.509 sertifika parmak izi.
    • <GUID>: Uygulamayı bilgilendirme amacıyla temsil etmek için geliştirici tarafından oluşturulan GUID.

    Başvuru amacıyla, UYGULAMADA GUID'yi paket etiketi olarak depolayın:

    • Visual Studio'da:
      • Çözüm Gezgini'da uygulamaya sağ tıklayıp Özellikler'i seçerek uygulamanın proje özelliklerini açın.
      • Paket sekmesini seçin.
      • Etiketler alanına oluşturduğunuz GUID'yi girin.
    • Visual Studio'yu kullanmadığınızda:
      • Uygulamanın proje dosyasını açın.

      • <PackageTags> Oluşturduğunuz GUID ile yeni veya var olan <PropertyGroup> bir özelliğe özellik ekleyin:

        <PropertyGroup>
          <PackageTags>9412ee86-c21b-4eb8-bd89-f650fbf44931</PackageTags>
        </PropertyGroup>
        

    Aşağıdaki örnekte:

    • Sunucunun yerel IP adresi şeklindedir 10.0.0.4.
    • Çevrimiçi rastgele GUID oluşturucu değeri appid sağlar.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Bir sertifika kaydedildiğinde, araç ile SSL Certificate successfully addedyanıt verir.

    Sertifika kaydını silmek için komutunu delete sslcert kullanın:

    netsh http delete sslcert ipport=<IP>:<PORT>
    

    netsh.exe için başvuru belgeleri:

  8. Uygulamayı çalıştırma.

    Yönetici istrator ayrıcalıkları, 1024'ten büyük bir bağlantı noktası numarasıyla HTTP (HTTPS değil) kullanarak localhost'a bağlanırken uygulamayı çalıştırmak için gerekli değildir. Diğer yapılandırmalar için (örneğin, yerel IP adresi kullanma veya bağlantı noktası 443'e bağlama) uygulamayı yönetici ayrıcalıklarıyla çalıştırın.

    Uygulama, sunucunun genel IP adresinden yanıt verir. Bu örnekte, sunucuya genel IP adresinden 104.214.79.47İnternet'ten ulaşılır.

    Bu örnekte bir geliştirme sertifikası kullanılır. Tarayıcının güvenilmeyen sertifika uyarısı atlandıktan sonra sayfa güvenli bir şekilde yüklenir.

    Browser window showing the app's Index page loaded

Ara sunucu ve yük dengeleyici senaryoları

HTTP.sys tarafından barındırılan ve İnternet'ten veya şirket ağından gelen isteklerle etkileşim kuran uygulamalar için, ara sunucuların ve yük dengeleyicilerin arkasında barındırırken ek yapılandırma gerekebilir. Daha fazla bilgi için bkz. ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma.

IHttpSysRequestTimingFeature ile ayrıntılı zamanlama bilgilerini alma

IHttpSysRequestTimingFeature , istekler için ayrıntılı zamanlama bilgileri sağlar:

  • Zaman damgaları QueryPerformanceCounter kullanılarak elde edilir.
  • Zaman damgası sıklığı QueryPerformanceFrequency aracılığıyla elde edilebilir.
  • Zamanlamanın dizini HttpSysRequestTimingType'a yayınlanabilir ve zamanlamanın neyi temsil ettiği öğrenilebilir.
  • Geçerli istek için zamanlama kullanılamıyorsa değer 0 olabilir.
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseHttpSys();

var app = builder.Build();

app.Use((context, next) =>
{
    var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
    
    var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
    var logger = loggerFactory.CreateLogger("Sample");

    var timestamps = feature.Timestamps;

    for (var i = 0; i < timestamps.Length; i++)
    {
        var timestamp = timestamps[i];
        var timingType = (HttpSysRequestTimingType)i;

        logger.LogInformation("Timestamp {timingType}: {timestamp}",
                                          timingType, timestamp);
    }

    return next(context);
});

app.MapGet("/", () => Results.Ok());

app.Run();

IHttpSysRequestTimingFeature.TryGetTimestamp , sağlanan zamanlama türü için zaman damgasını alır:

using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseHttpSys();

var app = builder.Build();

app.Use((context, next) =>
{
    var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();

    var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
    var logger = loggerFactory.CreateLogger("Sample");

    var timingType = HttpSysRequestTimingType.RequestRoutingEnd;

    if (feature.TryGetTimestamp(timingType, out var timestamp))
    {
        logger.LogInformation("Timestamp {timingType}: {timestamp}",
                                          timingType, timestamp);
    }
    else
    {
        logger.LogInformation("Timestamp {timingType}: not available for the "
                                           + "current request",    timingType);
    }

    return next(context);
});

app.MapGet("/", () => Results.Ok());

app.Run();

IHttpSysRequestTimingFeature.TryGetElapsedTime , belirtilen iki zamanlama arasında geçen süreyi verir:

using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseHttpSys();

var app = builder.Build();

app.Use((context, next) =>
{
    var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();

    var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
    var logger = loggerFactory.CreateLogger("Sample");

    var startingTimingType = HttpSysRequestTimingType.RequestRoutingStart;
    var endingTimingType = HttpSysRequestTimingType.RequestRoutingEnd;

    if (feature.TryGetElapsedTime(startingTimingType, endingTimingType, out var elapsed))
    {
        logger.LogInformation(
            "Elapsed time {startingTimingType} to {endingTimingType}: {elapsed}",
            startingTimingType,
            endingTimingType,
            elapsed);
    }
    else
    {
        logger.LogInformation(
            "Elapsed time {startingTimingType} to {endingTimingType}:"
            + " not available for the current request.",
            startingTimingType,
            endingTimingType);
    }

    return next(context);
});

app.MapGet("/", () => Results.Ok());

app.Run();

gRPC'yi desteklemek için gelişmiş HTTP/2 özellikleri

HTTP.sys'deki ek HTTP/2 özellikleri, yanıt fragmanları ve sıfırlama çerçeveleri gönderme desteği de dahil olmak üzere gRPC'yi destekler.

HTTP.sys ile gRPC çalıştırma gereksinimleri:

  • Windows 11 Derleme 22000 veya üzeri, Windows Server 2022 Derleme 20348 veya üzeri.
  • TLS 1.2 veya üzeri bağlantı.

Römork

HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.

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

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

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

Yukarıdaki örnek kodda:

  • SupportsTrailers , römorkların yanıt için desteklendiğini güvence altına alır.
  • DeclareTrailer verilen römork adını yanıt üst bilgisine Trailer ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsa DeclareTrailer , yanıt üst bilgileri gönderilmeden önce olmalıdır.
  • AppendTrailer römorku ekler.

Reset

Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.

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

Reset yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR . HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.

Ek kaynaklar

HTTP.sys, ASP.NET Core için yalnızca Windows üzerinde çalışan bir web sunucusudur. HTTP.sys, sunucuya Kestrel alternatiftir ve sağlamayan Kestrel bazı özellikler sunar.

Önemli

HTTP.sys, ASP.NET Core Modülü ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.

HTTP.sys aşağıdaki özellikleri destekler:

  • Windows Kimlik Doğrulaması
  • Bağlantı noktası paylaşma
  • SNI ile HTTPS
  • TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
  • Doğrudan dosya iletimi
  • Yanıtları Önbelleğe Alma
  • WebSockets (Windows 8 veya üzeri)

Desteklenen Windows sürümleri:

  • Windows 7 veya üzeri
  • Windows Server 2008 R2 veya üzeri

Örnek kodu görüntüleme veya indirme (indirme)

HTTP.sys ne zaman kullanılır?

HTTP.sys, aşağıdaki durumlarda dağıtımlar için kullanışlıdır:

  • IIS kullanmadan sunucuyu doğrudan İnternet'te kullanıma sunmanız gerekir.

    HTTP.sys communicates directly with the Internet

  • İç dağıtım, içinde Kestrelkullanılamayan bir özellik gerektirir. Daha fazla bilgi için bkz Kestrel . VS. HTTP.sys

    HTTP.sys communicates directly with the internal network

HTTP.sys, birçok saldırı türüne karşı koruma sağlayan ve tam özellikli bir web sunucusunun sağlamlığını, güvenliğini ve ölçeklenebilirliğini sağlayan olgun bir teknolojidir. IIS'nin kendisi, HTTP.sys dosyasının üzerinde bir HTTP dinleyicisi olarak çalışır.

HTTP/2 desteği

HTTP/2 , aşağıdaki temel gereksinimler karşılandığında ASP.NET Core uygulamaları için etkinleştirilir:

HTTP/2 bağlantısı kuruluyorsa HttpRequest.ProtocolHTTP/2 bildirir.

HTTP/2 varsayılan olarak etkinleştirilir. HTTP/2 bağlantısı kurulmazsa, bağlantı HTTP/1.1'e geri döner. Windows'un gelecekteki bir sürümünde, HTTP/2'yi HTTP.sys ile devre dışı bırakma özelliği de dahil olmak üzere HTTP/2 yapılandırma bayrakları kullanılabilir olacaktır.

HTTP/3 desteği

HTTP/3 , aşağıdaki temel gereksinimler karşılandığında ASP.NET Core uygulamaları için etkinleştirilir:

Önceki Windows 11 Derleme sürümleri bir Windows Insider derlemesinin kullanılmasını gerektirebilir.

HTTP/3, üst bilgi aracılığıyla alt-svc HTTP/1.1 veya HTTP/2'den yükseltme olarak bulunur. Bu, ilk isteğin HTTP/3'e geçmeden önce normalde HTTP/1.1 veya HTTP/2 kullanacağı anlamına gelir. Http.Sys üst bilgiyi otomatik olarak eklemez alt-svc , uygulama tarafından eklenmesi gerekir. Aşağıdaki kod, yanıt üst bilgisini ekleyen alt-svc bir ara yazılım örneğidir.

app.Use((context, next) =>
{
    context.Response.Headers.AltSvc = "h3=\":443\"";
    return next(context);
});

Yukarıdaki kodu istek işlem hattının başına yerleştirin.

Http.Sys, istemciye HTTP/3'ün kullanılabilir olduğunu bildirmek için yanıt üst bilgisi yerine AltSvc HTTP/2 protokol iletisi göndermeyi de destekler. Bkz. EnableAltSvc kayıt defteri anahtarı. Bunun için IP adresleri yerine konak adlarını kullanan netsh sslcert bağlamaları gerekir.

Kerberos ile çekirdek modu kimlik doğrulaması

HTTP.sys, Kerberos kimlik doğrulama protokolüyle çekirdek modu kimlik doğrulamasını temsil eder. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.

HTTP.sys kullanma

ASP.NET Core uygulamasını HTTP.sys kullanacak şekilde yapılandırma

Konağı UseHttpSys oluştururken gerekli HttpSysOptionsolan herhangi bir öğesini belirterek uzantı yöntemini çağırın. Aşağıdaki örnek, seçenekleri varsayılan değerlerine ayarlar:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseHttpSys(options =>
            {
                options.AllowSynchronousIO = false;
                options.Authentication.Schemes = AuthenticationSchemes.None;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = null;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5005");
            });
            webBuilder.UseStartup<Startup>();
        });

Ek HTTP.sys yapılandırması kayıt defteri ayarları aracılığıyla işlenir.

HTTP.sys seçenekleri hakkında daha fazla bilgi için bkz HttpSysOptions. .

MaxRequestBodySize

Bayt cinsinden herhangi bir istek gövdesinin izin verilen en büyük boyutu. olarak nullayarlandığında, istek gövdesi boyutu üst sınırı sınırsızdır. Bu sınırın, her zaman sınırsız olan yükseltilmiş bağlantılar üzerinde hiçbir etkisi yoktur.

Tek bir ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için IActionResult önerilen yöntem, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Uygulama isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa bir özel durum oluşur. Özelliğin IsReadOnlyMaxRequestBodySize salt okunur durumda olup olmadığını belirtmek için bir özellik kullanılabilir; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.

Uygulamanın istek başına geçersiz kılması MaxRequestBodySize gerekiyorsa kullanın IHttpMaxRequestBodySizeFeature:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, 
    ILogger<Startup> logger, IServer server)
{
    app.Use(async (context, next) =>
    {
        context.Features.Get<IHttpMaxRequestBodySizeFeature>()
            .MaxRequestBodySize = 10 * 1024;

        var serverAddressesFeature = 
            app.ServerFeatures.Get<IServerAddressesFeature>();
        var addresses = string.Join(", ", serverAddressesFeature?.Addresses);

        logger.LogInformation("Addresses: {Addresses}", addresses);

        await next.Invoke();
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Visual Studio kullanıyorsanız, uygulamanın IIS veya IIS Express'i çalıştıracak şekilde yapılandırılmadığından emin olun.

Visual Studio'da varsayılan başlatma profili IIS Express içindir. Projeyi konsol uygulaması olarak çalıştırmak için, aşağıdaki ekran görüntüsünde gösterildiği gibi seçili profili el ile değiştirin:

Select console app profile

Windows Server'ı yapılandırma

  1. Uygulama için açılacak bağlantı noktalarını belirleyin ve trafiğin HTTP.sys dosyasına ulaşmasına izin vermek üzere güvenlik duvarı bağlantı noktalarını açmak için Windows Güvenlik Duvarı'nı veya New-NetFirewallRule PowerShell cmdlet'ini kullanın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.

  2. Azure VM'sine dağıtım yaparken Ağ Güvenlik Grubu'ndaki bağlantı noktalarını açın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.

  3. Gerekirse X.509 sertifikalarını alın ve yükleyin.

    Windows'da, New-SelfSignedCertificate PowerShell cmdlet'ini kullanarak otomatik olarak imzalanan sertifikalar oluşturun. Desteklenmeyen bir örnek için bkz . UpdateIISExpressSSLForChrome.ps1.

    Sunucunun Yerel Makine>Kişisel deposuna otomatik olarak imzalanan veya CA imzalı sertifikalar yükleyin.

  4. Uygulama çerçeveye bağımlı bir dağıtımsa .NET Core, .NET Framework veya her ikisini birden yükleyin (uygulama .NET Framework'ü hedefleyen bir .NET Core uygulamasıysa).

    • .NET Core: Uygulama .NET Core gerektiriyorsa .NET Core İndirmeleri'nden .NET Core Çalışma Zamanı yükleyicisini alın ve çalıştırın. Tam SDK'yi sunucuya yüklemeyin.
    • .NET Framework: Uygulama .NET Framework gerektiriyorsa , .NET Framework yükleme kılavuzuna bakın. Gerekli .NET Framework'ü yükleyin. En son .NET Framework yükleyicisine .NET Core İndirmeleri sayfasından ulaşabilirsiniz.

    Uygulama bağımsız bir dağıtımsa, uygulama çalışma zamanını dağıtımına ekler. Sunucuda çerçeve yüklemesi gerekmez.

  5. Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.

    Varsayılan olarak, ASP.NET Core öğesine http://localhost:5000bağlanır. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:

    • UseUrls
    • urls komut satırı bağımsız değişkeni
    • ASPNETCORE_URLS ortam değişkeni
    • UrlPrefixes

    Aşağıdaki kod örneği, 443 numaralı bağlantı noktasında sunucunun yerel IP adresiyle 10.0.0.4 nasıl kullanılacağını UrlPrefixes gösterir:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseHttpSys(options =>
                {
                    options.UrlPrefixes.Add("https://10.0.0.4:443");
                });
                webBuilder.UseStartup<Startup>();
            });
    

    Bunun bir avantajı UrlPrefixes , hatalı biçimlendirilmiş ön ekler için hemen bir hata iletisi oluşturulmasıdır.

    Geçersiz kılma/ASPNETCORE_URLSUseUrlsurls/ayarlarındaki UrlPrefixes ayarlar. Bu nedenle, , urlsve ortam değişkeninin UseUrlsASPNETCORE_URLS avantajlarından biri, ve HTTP.sys arasında Kestrel geçişin daha kolay olmasıdır.

    HTTP.sys, HTTP Server API UrlPrefix dize biçimlerini kullanır.

    Uyarı

    En üst düzey joker karakter bağlamaları (http://*:80/ ve http://+:80) kullanılmamalıdır. Üst düzey joker karakter bağlamaları uygulama güvenlik açıkları oluşturur. Bu durum hem güçlü hem de zayıf joker karakterler için geçerlidir. Joker karakterler yerine açık konak adları veya IP adresleri kullanın. Alt etki alanı joker karakter bağlaması (örneğin, *.mysub.com) üst etki alanının tamamını denetlerseniz ( *.comgüvenlik açığı olan yerine) bir güvenlik riski değildir. Daha fazla bilgi için bkz . RFC 9110: Bölüm 7.2: Konak ve :authority.

  6. Sunucudaki URL ön eklerini önceden kaydedin.

    HTTP.sys'yi yapılandırmaya yönelik yerleşik araç netsh.exe'dir. netsh.exe , URL ön eklerini ayırmak ve X.509 sertifikaları atamak için kullanılır. Araç yönetici ayrıcalıkları gerektirir.

    Uygulamaya URL'leri kaydetmek için netsh.exe aracını kullanın:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: Tam Tekdüzen Kaynak Bulucu (URL). Joker karakter bağlaması kullanmayın. Geçerli bir ana bilgisayar adı veya yerel IP adresi kullanın. URL sonunda bir eğik çizgi içermelidir.
    • <USER>: Kullanıcı veya kullanıcı grubu adını belirtir.

    Aşağıdaki örnekte, sunucunun yerel IP adresi şöyledir 10.0.0.4:

    netsh http add urlacl url=https://10.0.0.4:443/ user=Users
    

    Bir URL kaydedildiğinde, araç ile URL reservation successfully addedyanıt verir.

    Kayıtlı URL'yi silmek için komutunu delete urlacl kullanın:

    netsh http delete urlacl url=<URL>
    
  7. X.509 sertifikalarını sunucuya kaydedin.

    Uygulamaya sertifika kaydetmek için netsh.exe aracını kullanın:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Bağlama için yerel IP adresini belirtir. Joker karakter bağlaması kullanmayın. Geçerli bir IP adresi kullanın.
    • <PORT>: Bağlamanın bağlantı noktasını belirtir.
    • <THUMBPRINT>: X.509 sertifika parmak izi.
    • <GUID>: Uygulamayı bilgilendirme amacıyla temsil etmek için geliştirici tarafından oluşturulan GUID.

    Başvuru amacıyla, UYGULAMADA GUID'yi paket etiketi olarak depolayın:

    • Visual Studio'da:
      • Çözüm Gezgini'da uygulamaya sağ tıklayıp Özellikler'i seçerek uygulamanın proje özelliklerini açın.
      • Paket sekmesini seçin.
      • Etiketler alanına oluşturduğunuz GUID'yi girin.
    • Visual Studio'yu kullanmadığınızda:
      • Uygulamanın proje dosyasını açın.

      • <PackageTags> Oluşturduğunuz GUID ile yeni veya var olan <PropertyGroup> bir özelliğe özellik ekleyin:

        <PropertyGroup>
          <PackageTags>9412ee86-c21b-4eb8-bd89-f650fbf44931</PackageTags>
        </PropertyGroup>
        

    Aşağıdaki örnekte:

    • Sunucunun yerel IP adresi şeklindedir 10.0.0.4.
    • Çevrimiçi rastgele GUID oluşturucu değeri appid sağlar.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Bir sertifika kaydedildiğinde, araç ile SSL Certificate successfully addedyanıt verir.

    Sertifika kaydını silmek için komutunu delete sslcert kullanın:

    netsh http delete sslcert ipport=<IP>:<PORT>
    

    netsh.exe için başvuru belgeleri:

  8. Uygulamayı çalıştırma.

    Yönetici istrator ayrıcalıkları, 1024'ten büyük bir bağlantı noktası numarasıyla HTTP (HTTPS değil) kullanarak localhost'a bağlanırken uygulamayı çalıştırmak için gerekli değildir. Diğer yapılandırmalar için (örneğin, yerel IP adresi kullanma veya bağlantı noktası 443'e bağlama) uygulamayı yönetici ayrıcalıklarıyla çalıştırın.

    Uygulama, sunucunun genel IP adresinden yanıt verir. Bu örnekte, sunucuya genel IP adresinden 104.214.79.47İnternet'ten ulaşılır.

    Bu örnekte bir geliştirme sertifikası kullanılır. Tarayıcının güvenilmeyen sertifika uyarısı atlandıktan sonra sayfa güvenli bir şekilde yüklenir.

    Browser window showing the app's Index page loaded

Ara sunucu ve yük dengeleyici senaryoları

HTTP.sys tarafından barındırılan ve İnternet'ten veya şirket ağından gelen isteklerle etkileşim kuran uygulamalar için, ara sunucuların ve yük dengeleyicilerin arkasında barındırırken ek yapılandırma gerekebilir. Daha fazla bilgi için bkz. ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma.

gRPC'yi desteklemek için gelişmiş HTTP/2 özellikleri

HTTP.sys'deki ek HTTP/2 özellikleri, yanıt fragmanları ve sıfırlama çerçeveleri gönderme desteği de dahil olmak üzere gRPC'yi destekler.

HTTP.sys ile gRPC çalıştırma gereksinimleri:

  • Windows 11 Derleme 22000 veya üzeri, Windows Server 2022 Derleme 20348 veya üzeri.
  • TLS 1.2 veya üzeri bağlantı.

Römork

HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.

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

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

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

Yukarıdaki örnek kodda:

  • SupportsTrailers , römorkların yanıt için desteklendiğini güvence altına alır.
  • DeclareTrailer verilen römork adını yanıt üst bilgisine Trailer ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsa DeclareTrailer , yanıt üst bilgileri gönderilmeden önce olmalıdır.
  • AppendTrailer römorku ekler.

Reset

Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.

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

Reset yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR . HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.

Ek kaynaklar

HTTP.sys, ASP.NET Core için yalnızca Windows üzerinde çalışan bir web sunucusudur. HTTP.sys, sunucuya Kestrel alternatiftir ve sağlamayan Kestrel bazı özellikler sunar.

Önemli

HTTP.sys, ASP.NET Core Modülü ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.

HTTP.sys aşağıdaki özellikleri destekler:

  • Windows Kimlik Doğrulaması
  • Bağlantı noktası paylaşma
  • SNI ile HTTPS
  • TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
  • Doğrudan dosya iletimi
  • Yanıtları Önbelleğe Alma
  • WebSockets (Windows 8 veya üzeri)

Desteklenen Windows sürümleri:

  • Windows 7 veya üzeri
  • Windows Server 2008 R2 veya üzeri

Örnek kodu görüntüleme veya indirme (indirme)

HTTP.sys ne zaman kullanılır?

HTTP.sys, aşağıdaki durumlarda dağıtımlar için kullanışlıdır:

  • IIS kullanmadan sunucuyu doğrudan İnternet'te kullanıma sunmanız gerekir.

    HTTP.sys communicates directly with the Internet

  • İç dağıtım, içinde Kestrelkullanılamayan bir özellik gerektirir. Daha fazla bilgi için bkz Kestrel . VS. HTTP.sys

    HTTP.sys communicates directly with the internal network

HTTP.sys, birçok saldırı türüne karşı koruma sağlayan ve tam özellikli bir web sunucusunun sağlamlığını, güvenliğini ve ölçeklenebilirliğini sağlayan olgun bir teknolojidir. IIS'nin kendisi, HTTP.sys dosyasının üzerinde bir HTTP dinleyicisi olarak çalışır.

HTTP/2 desteği

Aşağıdaki temel gereksinimler karşılanırsa HTTP/2 ASP.NET Core uygulamaları için etkinleştirilir:

HTTP/2 bağlantısı kuruluyorsa HttpRequest.ProtocolHTTP/2 bildirir.

HTTP/2 varsayılan olarak etkinleştirilir. HTTP/2 bağlantısı kurulmazsa, bağlantı HTTP/1.1'e geri döner. Windows'un gelecekteki bir sürümünde, HTTP/2'yi HTTP.sys ile devre dışı bırakma özelliği de dahil olmak üzere HTTP/2 yapılandırma bayrakları kullanılabilir olacaktır.

Kerberos ile çekirdek modu kimlik doğrulaması

HTTP.sys, Kerberos kimlik doğrulama protokolüyle çekirdek modu kimlik doğrulamasını temsil eder. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.

HTTP.sys kullanma

ASP.NET Core uygulamasını HTTP.sys kullanacak şekilde yapılandırma

Konağı UseHttpSys oluştururken gerekli HttpSysOptionsolan herhangi bir öğesini belirterek uzantı yöntemini çağırın. Aşağıdaki örnek, seçenekleri varsayılan değerlerine ayarlar:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseHttpSys(options =>
            {
                options.AllowSynchronousIO = false;
                options.Authentication.Schemes = AuthenticationSchemes.None;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = null;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5005");
            });
            webBuilder.UseStartup<Startup>();
        });

Ek HTTP.sys yapılandırması kayıt defteri ayarları aracılığıyla işlenir.

HTTP.sys seçenekleri

Özellik Tanım Varsayılan
AllowSynchronousIO ve HttpContext.Response.Bodyiçin zaman uyumlu giriş/çıkışa HttpContext.Request.Body izin verilip verilmeyeceğini denetleyin. false
Authentication.AllowAnonymous Anonim isteklere izin verin. true
Authentication.Schemes İzin verilen kimlik doğrulama düzenlerini belirtin. Dinleyicinin yok edilmesinden önce herhangi bir zamanda değiştirilebilir. Değerler AuthenticationSchemes sabit listesi tarafından sağlanır: Basic, Kerberos, Negotiate, Noneve NTLM. None
EnableResponseCaching Uygun üst bilgiler içeren yanıtlar için çekirdek modu önbelleğe almayı deneme. Yanıt , Varyveya Pragma üst bilgileri içermeyebilirSet-Cookie. bir veya değeri veya üst bilgisi içeren public bir shared-max-agemax-ageExpires üst bilgi içermelidir.Cache-Control true
Http503Verbosity Azaltma koşulları nedeniyle istekleri reddederken HTTP.sys davranışı. Http503VerbosityLevel.
Temel
MaxAccepts En fazla eşzamanlı kabul sayısı. 5 × Ortamı.
ProcessorCount
MaxConnections Kabul etmek için en fazla eşzamanlı bağlantı sayısı. Sonsuz için kullanın -1 . Kayıt defterinin makine genelindeki ayarını kullanmak için kullanın null . null
(makine genelinde
ayarı)
MaxRequestBodySize MaxRequestBodySize bölümüne bakın. 30000000 bayt
(~28,6 MB)
RequestQueueLimit Kuyruğa alınabilecek en fazla istek sayısı. 1000
RequestQueueMode Bu, sunucunun istek kuyruğu oluşturma ve yapılandırmadan sorumlu olup olmadığını veya mevcut kuyruğa eklenip eklenmeyeceğini gösterir.
Mevcut yapılandırma seçeneklerinin çoğu mevcut kuyruğa eklenirken uygulanmaz.
RequestQueueMode.Create
RequestQueueName HTTP.sys istek kuyruğunun adı. null (Anonim kuyruk)
ThrowWriteExceptions İstemci bağlantısı kesildiğinden başarısız olan yanıt gövdesi yazma işleminin özel durumlar oluşturarak veya normal şekilde tamamlanmasını sağlayın. false
(normal şekilde tamamla)
Timeouts Kayıt defterinde de yapılandırılabilir olan HTTP.sys TimeoutManager yapılandırmasını kullanıma sunma. Varsayılan değerler de dahil olmak üzere her ayar hakkında daha fazla bilgi edinmek için API bağlantılarını izleyin:
UrlPrefixes UrlPrefixCollection HTTP.sys dosyasına kaydedilecek öğesini belirtin. En kullanışlı olan , UrlPrefixCollection.Addkoleksiyona bir ön ek eklemek için kullanılır. Bunlar dinleyicinin yok edilmesinden önce herhangi bir zamanda değiştirilebilir.

MaxRequestBodySize

Bayt cinsinden herhangi bir istek gövdesinin izin verilen en büyük boyutu. olarak nullayarlandığında, istek gövdesi boyutu üst sınırı sınırsızdır. Bu sınırın, her zaman sınırsız olan yükseltilmiş bağlantılar üzerinde hiçbir etkisi yoktur.

Tek bir ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için IActionResult önerilen yöntem, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Uygulama isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa bir özel durum oluşur. Özelliğin IsReadOnlyMaxRequestBodySize salt okunur durumda olup olmadığını belirtmek için bir özellik kullanılabilir; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.

Uygulamanın istek başına geçersiz kılması MaxRequestBodySize gerekiyorsa kullanın IHttpMaxRequestBodySizeFeature:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, 
    ILogger<Startup> logger, IServer server)
{
    app.Use(async (context, next) =>
    {
        context.Features.Get<IHttpMaxRequestBodySizeFeature>()
            .MaxRequestBodySize = 10 * 1024;

        var serverAddressesFeature = 
            app.ServerFeatures.Get<IServerAddressesFeature>();
        var addresses = string.Join(", ", serverAddressesFeature?.Addresses);

        logger.LogInformation("Addresses: {Addresses}", addresses);

        await next.Invoke();
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Visual Studio kullanıyorsanız, uygulamanın IIS veya IIS Express'i çalıştıracak şekilde yapılandırılmadığından emin olun.

Visual Studio'da varsayılan başlatma profili IIS Express içindir. Projeyi konsol uygulaması olarak çalıştırmak için, aşağıdaki ekran görüntüsünde gösterildiği gibi seçili profili el ile değiştirin:

Select console app profile

Windows Server'ı yapılandırma

  1. Uygulama için açılacak bağlantı noktalarını belirleyin ve trafiğin HTTP.sys dosyasına ulaşmasına izin vermek üzere güvenlik duvarı bağlantı noktalarını açmak için Windows Güvenlik Duvarı'nı veya New-NetFirewallRule PowerShell cmdlet'ini kullanın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.

  2. Azure VM'sine dağıtım yaparken Ağ Güvenlik Grubu'ndaki bağlantı noktalarını açın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.

  3. Gerekirse X.509 sertifikalarını alın ve yükleyin.

    Windows'da, New-SelfSignedCertificate PowerShell cmdlet'ini kullanarak otomatik olarak imzalanan sertifikalar oluşturun. Desteklenmeyen bir örnek için bkz . UpdateIISExpressSSLForChrome.ps1.

    Sunucunun Yerel Makine>Kişisel deposuna otomatik olarak imzalanan veya CA imzalı sertifikalar yükleyin.

  4. Uygulama çerçeveye bağımlı bir dağıtımsa .NET Core, .NET Framework veya her ikisini birden yükleyin (uygulama .NET Framework'ü hedefleyen bir .NET Core uygulamasıysa).

    • .NET Core: Uygulama .NET Core gerektiriyorsa .NET Core İndirmeleri'nden .NET Core Çalışma Zamanı yükleyicisini alın ve çalıştırın. Tam SDK'yi sunucuya yüklemeyin.
    • .NET Framework: Uygulama .NET Framework gerektiriyorsa , .NET Framework yükleme kılavuzuna bakın. Gerekli .NET Framework'ü yükleyin. En son .NET Framework yükleyicisine .NET Core İndirmeleri sayfasından ulaşabilirsiniz.

    Uygulama bağımsız bir dağıtımsa, uygulama çalışma zamanını dağıtımına ekler. Sunucuda çerçeve yüklemesi gerekmez.

  5. Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.

    Varsayılan olarak, ASP.NET Core öğesine http://localhost:5000bağlanır. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:

    • UseUrls
    • urls komut satırı bağımsız değişkeni
    • ASPNETCORE_URLS ortam değişkeni
    • UrlPrefixes

    Aşağıdaki kod örneği, 443 numaralı bağlantı noktasında sunucunun yerel IP adresiyle 10.0.0.4 nasıl kullanılacağını UrlPrefixes gösterir:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseHttpSys(options =>
                {
                    options.UrlPrefixes.Add("https://10.0.0.4:443");
                });
                webBuilder.UseStartup<Startup>();
            });
    

    Bunun bir avantajı UrlPrefixes , hatalı biçimlendirilmiş ön ekler için hemen bir hata iletisi oluşturulmasıdır.

    Geçersiz kılma/ASPNETCORE_URLSUseUrlsurls/ayarlarındaki UrlPrefixes ayarlar. Bu nedenle, , urlsve ortam değişkeninin UseUrlsASPNETCORE_URLS avantajlarından biri, ve HTTP.sys arasında Kestrel geçişin daha kolay olmasıdır.

    HTTP.sys, HTTP Server API UrlPrefix dize biçimlerini kullanır.

    Uyarı

    En üst düzey joker karakter bağlamaları (http://*:80/ ve http://+:80) kullanılmamalıdır. Üst düzey joker karakter bağlamaları uygulama güvenlik açıkları oluşturur. Bu durum hem güçlü hem de zayıf joker karakterler için geçerlidir. Joker karakterler yerine açık konak adları veya IP adresleri kullanın. Alt etki alanı joker karakter bağlaması (örneğin, *.mysub.com) üst etki alanının tamamını denetlerseniz ( *.comgüvenlik açığı olan yerine) bir güvenlik riski değildir. Daha fazla bilgi için bkz . RFC 9110: Bölüm 7.2: Konak ve :authority.

  6. Sunucudaki URL ön eklerini önceden kaydedin.

    HTTP.sys'yi yapılandırmaya yönelik yerleşik araç netsh.exe'dir. netsh.exe , URL ön eklerini ayırmak ve X.509 sertifikaları atamak için kullanılır. Araç yönetici ayrıcalıkları gerektirir.

    Uygulamaya URL'leri kaydetmek için netsh.exe aracını kullanın:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: Tam Tekdüzen Kaynak Bulucu (URL). Joker karakter bağlaması kullanmayın. Geçerli bir ana bilgisayar adı veya yerel IP adresi kullanın. URL sonunda bir eğik çizgi içermelidir.
    • <USER>: Kullanıcı veya kullanıcı grubu adını belirtir.

    Aşağıdaki örnekte, sunucunun yerel IP adresi şöyledir 10.0.0.4:

    netsh http add urlacl url=https://10.0.0.4:443/ user=Users
    

    Bir URL kaydedildiğinde, araç ile URL reservation successfully addedyanıt verir.

    Kayıtlı URL'yi silmek için komutunu delete urlacl kullanın:

    netsh http delete urlacl url=<URL>
    
  7. X.509 sertifikalarını sunucuya kaydedin.

    Uygulamaya sertifika kaydetmek için netsh.exe aracını kullanın:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Bağlama için yerel IP adresini belirtir. Joker karakter bağlaması kullanmayın. Geçerli bir IP adresi kullanın.
    • <PORT>: Bağlamanın bağlantı noktasını belirtir.
    • <THUMBPRINT>: X.509 sertifika parmak izi.
    • <GUID>: Uygulamayı bilgilendirme amacıyla temsil etmek için geliştirici tarafından oluşturulan GUID.

    Başvuru amacıyla, UYGULAMADA GUID'yi paket etiketi olarak depolayın:

    • Visual Studio'da:
      • Çözüm Gezgini'da uygulamaya sağ tıklayıp Özellikler'i seçerek uygulamanın proje özelliklerini açın.
      • Paket sekmesini seçin.
      • Etiketler alanına oluşturduğunuz GUID'yi girin.
    • Visual Studio'yu kullanmadığınızda:
      • Uygulamanın proje dosyasını açın.

      • <PackageTags> Oluşturduğunuz GUID ile yeni veya var olan <PropertyGroup> bir özelliğe özellik ekleyin:

        <PropertyGroup>
          <PackageTags>9412ee86-c21b-4eb8-bd89-f650fbf44931</PackageTags>
        </PropertyGroup>
        

    Aşağıdaki örnekte:

    • Sunucunun yerel IP adresi şeklindedir 10.0.0.4.
    • Çevrimiçi rastgele GUID oluşturucu değeri appid sağlar.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Bir sertifika kaydedildiğinde, araç ile SSL Certificate successfully addedyanıt verir.

    Sertifika kaydını silmek için komutunu delete sslcert kullanın:

    netsh http delete sslcert ipport=<IP>:<PORT>
    

    netsh.exe için başvuru belgeleri:

  8. Uygulamayı çalıştırma.

    Yönetici istrator ayrıcalıkları, 1024'ten büyük bir bağlantı noktası numarasıyla HTTP (HTTPS değil) kullanarak localhost'a bağlanırken uygulamayı çalıştırmak için gerekli değildir. Diğer yapılandırmalar için (örneğin, yerel IP adresi kullanma veya bağlantı noktası 443'e bağlama) uygulamayı yönetici ayrıcalıklarıyla çalıştırın.

    Uygulama, sunucunun genel IP adresinden yanıt verir. Bu örnekte, sunucuya genel IP adresinden 104.214.79.47İnternet'ten ulaşılır.

    Bu örnekte bir geliştirme sertifikası kullanılır. Tarayıcının güvenilmeyen sertifika uyarısı atlandıktan sonra sayfa güvenli bir şekilde yüklenir.

    Browser window showing the app's Index page loaded

Ara sunucu ve yük dengeleyici senaryoları

HTTP.sys tarafından barındırılan ve İnternet'ten veya şirket ağından gelen isteklerle etkileşim kuran uygulamalar için, ara sunucuların ve yük dengeleyicilerin arkasında barındırırken ek yapılandırma gerekebilir. Daha fazla bilgi için bkz. ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma.

gRPC'yi desteklemek için gelişmiş HTTP/2 özellikleri

HTTP.sys'deki ek HTTP/2 özellikleri, yanıt fragmanları ve sıfırlama çerçeveleri gönderme desteği de dahil olmak üzere gRPC'yi destekler.

HTTP.sys ile gRPC çalıştırma gereksinimleri:

  • Windows 10, İs Derlemesi 19041.508 veya üzeri
  • TLS 1.2 veya üzeri bağlantısı

Römork

HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.

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

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

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

Yukarıdaki örnek kodda:

  • SupportsTrailers , römorkların yanıt için desteklendiğini güvence altına alır.
  • DeclareTrailer verilen römork adını yanıt üst bilgisine Trailer ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsa DeclareTrailer , yanıt üst bilgileri gönderilmeden önce olmalıdır.
  • AppendTrailer römorku ekler.

Reset

Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.

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

Reset yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR . HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.

Ek kaynaklar