Aracılığıyla paylaş


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

Note

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Warning

bu ASP.NET Core sürümü artık desteklenmiyor. Daha fazla bilgi için bkz. .NET ve .NET Çekirdek Destek İlkesi. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Tarafından Tom Dykstra ve Chris Ross

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

Important

HTTP.sys ASP.NET Core Module ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.

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

  • Windows Authentication
  • Bağlantı noktası paylaşımı
  • SNI ile HTTPS
  • TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
  • TLS üzerinden HTTP/3 (Windows 11 veya üzeri)
  • Doğrudan dosya iletimi
  • Yanıtları Önbelleğe Alma
  • WebSockets (Windows 8 veya üzeri)
  • Özelleştirilebilir güvenlik tanımlayıcıları
  • Otomatik bellek havuzunun tahliyesi

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 doğrudan İnternet ile iletişim kurar

  • İç dağıtım, Kestrel içinde mevcut olmayan bir özelliğe ihtiyaç duyar. Daha fazla bilgi için bkz Kestrel . HTTP.sys karşılaştırması

    HTTP.sys doğrudan iç ağ ile iletişim kurar

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 ü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'in gelecekteki bir sürümünde, HTTP/2'yi HTTP.sysile 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, Windows Insider derlemesinin kullanılmasını gerektirebilir.

HTTP/3, alt-svc üst bilgi başlığı üzerinden HTTP/1.1 veya HTTP/2'den yükseltme olarak keşfedilir. Bu, ilk isteğin HTTP/3'e geçmeden önce normalde HTTP/1.1 veya HTTP/2 kullanacağı anlamına gelir. Http.Sys alt-svc üst bilgisini otomatik olarak eklemez, bu nedenle 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ı.

Note

Bunun için IP adresleri yerine konak adlarını kullanan netsh sslcert bağlamaları gerekir. Aşağıdaki komutlarda ipport öğesini hostnameport ile değiştirin ve IP adresini ana bilgisayar adıyla değiştirin, örneğin, www.example.com. certstorename parametresi belirtilmediği sürece hostnameport kullanımı başarısız oluyor. Varsayılan olarak kullanın certstorename=MY.

Kerberos ile çekirdek modunda kimlik doğrulaması

HTTP.sys, Kerberos kimlik doğrulama protokolüyle çekirdek modu kimlik doğrulamasını devreder. 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 jetonunun/biletin ş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 modunda yanıt arabelleği desteği

Bazı senaryolarda, yüksek gecikme süresine sahip yüksek hacimli küçük yazma işlemleri HTTP.sys'de önemli bir performans etkisine neden olabilir. Bu etki, HTTP.sys uygulamasında Pipe arabellek olmamasından kaynaklanır. Bu senaryolarda performansı geliştirmek için yanıt arabelleği desteği sağlanmaktadır HTTP.sys. HttpSysOptions.EnableKernelResponseBuffering ayarını etkinleştirmek için true olarak ayarlayın. Yanıt arabelleği, eşzamanlı G/Ç veya bir kerede en fazla bir bekleyen yazmaya sahip eşzamansız 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 nasıl kullanılır?

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

Konağı oluştururken gerekli öğeleri belirterek UseHttpSys 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 ayarları, kayıt defteri ayarları aracılığıyla yönetilir.

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

Güvenlik tanımlayıcılarını özelleştirme

HTTP.sys istek kuyruğu , uygulamanız bunları işlemeye hazır olana kadar gelen HTTP isteklerini geçici olarak depolayan çekirdek düzeyinde bir yapıdır. üzerinde HttpSysOptions özelliğini kullanarak istek kuyruğuna erişimi yönetin. GenericSecurityDescriptor örneğine ayarlayın ve HTTP.sys sunucunuzu yapılandırın.

Güvenlik tanımlayıcısını özelleştirerek, belirli kullanıcıların veya grupların istek kuyruğuna erişmesine izin verebilir veya erişimi reddedebilirsiniz. Bu, işletim sistemi düzeyinde HTTP.sys isteği işlemeyi kısıtlamak veya devretmek istediğiniz senaryolarda kullanışlıdır.

Örneğin, aşağıdaki kod kimliği doğrulanmış tüm kullanıcılara izin verir ancak konukları reddeder:

using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.AspNetCore.Server.HttpSys;

// Create a new security descriptor
var securityDescriptor = new CommonSecurityDescriptor(isContainer: false, isDS: false, sddlForm: string.Empty);

// Create a discretionary access control list (DACL)
var dacl = new DiscretionaryAcl(isContainer: false, isDS: false, capacity: 2);
dacl.AddAccess(
    AccessControlType.Allow,
    new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),
    -1,
    InheritanceFlags.None,
    PropagationFlags.None
);
dacl.AddAccess(
    AccessControlType.Deny,
    new SecurityIdentifier(WellKnownSidType.BuiltinGuestsSid, null),
    -1,
    InheritanceFlags.None,
    PropagationFlags.None
);

// Assign the DACL to the security descriptor
securityDescriptor.DiscretionaryAcl = dacl;

// Configure HTTP.sys options
var builder = WebApplication.CreateBuilder();
builder.WebHost.UseHttpSys(options =>
{
    options.RequestQueueSecurityDescriptor = securityDescriptor;
});

RequestQueueSecurityDescriptor özelliği yalnızca yeni bir istek kuyruğu oluştururken geçerlidir. Özellik, mevcut istek kuyruklarını etkilemez.

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 IActionResult için ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yöntem, bir eylem yönteminde RequestSizeLimitAttribute özniteliğini kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Uygulama, bir isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa bir istisna fırlatılır. Özelliğin IsReadOnly özelliği, MaxRequestBodySize özelliğinin salt okunur durumda olup olmadığını belirtmek için kullanılabilir; bu da sınırı yapılandırmak için artık çok geç olduğu anlamına gelir.

Uygulamanın, MaxRequestBodySize'yi isteğe bağlı olarak geçersiz kılması gerekiyorsa, IHttpMaxRequestBodySizeFeature kullanın:

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'de 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:

Konsol uygulaması profilini seçme

Windows Server yapılandırma

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

  2. Azure VM'ye dağıtım yaparken Network Güvenlik Grubu 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 New-SelfSignedCertificate PowerShell cmdlet 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 framework'e bağımlı bir dağıtımsa .NET, .NET Framework veya her ikisini de yükleyin (uygulama .NET Framework'ü hedefleyen .NET bir uygulamaysa).

    • .NET: Uygulama .NET gerektiriyorsa, .NET Downloads'den .NET Runtime 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 İndirmeler 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 http://localhost:5000 bağlar. 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 UrlPrefixes nasıl kullanılacağını 10.0.0.4 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.

    UrlPrefixes içindeki ayarlar, UseUrls/urls/ASPNETCORE_URLS ayarlarını geçersiz kılar. Bu nedenle, UseUrls, urls ve ASPNETCORE_URLS ortam değişkeninin avantajlarından biri, Kestrel ve HTTP.sys arasında geçiş yapmanın daha kolay olmasıdır.

    HTTP.sys URL ön eklerinde iki tür joker karakter tanır:

    • * , geri dönüş bağlaması olarak da bilinen zayıf bir bağlamadır. URL ön eki ise http://*:5000ve başka bir şey 5000 numaralı bağlantı noktasına bağlıysa, bu bağlama kullanılmaz.
    • + güçlü bir bağlamadır. URL ön eki ise http://+:5000, bu bağlama diğer bağlantı noktası 5000 bağlamalarından önce kullanılır.

    Daha fazla bilgi için bkz . UrlPrefix Dizeleri.

    Warning

    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 ana bilgisayar adları veya IP adresleri kullanın. Alt etki alanı joker karakter bağlaması (örneğin, *.mysub.com), üst etki alanının tamamını kontrol ettiğinizde güvenlik riski oluşturmaz (güvenlik açısından zayıf olan *.com yerine). Daha fazla bilgi için bkz. RFC 9110: Bölüm 7.2: Host 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, Kestrel ve HTTP.sys sunucuları için dinleme bağlantı noktalarını belirleyen yapılandırma anahtarlarıdır. Bu anahtarlar, DOTNET_ veya ASPNETCORE_ ön ekleriyle tanımlanan ortam değişkenleri olarak veya doğrudan appsettings.json gibi bir başka yapılandırma girişi aracılığıyla 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 için yerleşik yapılandırma aracı 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 anlamıyla nitelikli Tekdüzen Kaynak Bulucu (URL). Joker karakter bağlama 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 Properties'ı seçerek uygulamanın proje özelliklerini açın.
      • Paket sekmesini seçin.
      • Etiketler alanına oluşturduğunuz GUID'yi girin.
    • Visual Studio kullanmadığınızda:
      • Uygulamanın proje dosyasını açın.

      • Yeni veya mevcut bir <PropertyGroup> üzerine oluşturduğunuz GUID ile bir <PackageTags> özelliği ekleyin.

        <PropertyGroup>
          <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags>
        </PropertyGroup>
        

    Aşağıdaki örnekte:

    • Sunucunun yerel IP adresi şeklindedir 10.0.0.4.
    • Çevrimiçi bir rastgele GUID oluşturucu, appid değerini sağlar.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
    

    Bir sertifika kaydedildiğinde, araç SSL Certificate successfully added ile cevap 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.

    1024'ten büyük bağlantı noktası numarasına sahip HTTP (HTTPS değil) kullanarak localhost'a bağlanırken uygulamayı çalıştırmak için yönetici ayrıcalıkları 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.

    Uygulamanın Dizin sayfasının yüklendiğini gösteren tarayıcı penceresi

Ara sunucu ve yük dengeleyici senaryoları

İnternet'ten veya şirket ağından gelen isteklerle etkileşim kuran HTTP.sys tarafından barındırılan 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. Proxy sunucuları ve yük dengeleyicilerle çalışmak için ASP.NET Core 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.
  • Windows 10 sürüm 2004, Windows Server 2022 veya üzeri gerektirir.
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](/dotnet/api/microsoft.aspnetcore.server.httpsys.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'daki ek HTTP/2 özellikleri, yanıt fragmanları ve sıfırlama çerçeveleri gönderme desteği de dahil olmak üzere gRPC'yi destekler.

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

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

Trailers

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. DeclareTrailer çağrılırsa, yanıt üst bilgileri gönderilmeden önce çağrılmış olmalıdır.
  • AppendTrailer treyleri 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 iptal edildiği 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.

Tracing

HTTP.sys izlemelerini nasıl alacağınız hakkında bilgi için bkz HTTP.sys Yönetilebilirlik Senaryoları.

Bellek havuzundan otomatik çıkarma

, IIS ve HTTP.sys tarafından Kestrelkullanılan bellek havuzları, uygulama boşta veya düşük yük altındayken bellek bloklarını otomatik olarak çıkartır. Özellik otomatik olarak çalışır ve el ile etkinleştirilmesi veya yapılandırılması gerekmez.

10'dan önceki .NET sürümlerinde, kullanımda olmasa bile havuz tarafından ayrılan bellek korunur. Bu otomatik çıkarma özelliği, genel bellek kullanımını azaltır ve uygulamaların değişen iş yükleri altında yanıt vermelerine yardımcı olur.

Bellek havuzu ölçümlerini kullanma

ASP.NET Core sunucu uygulamaları tarafından kullanılan varsayılan bellek havuzu, bellek kullanım desenlerini izlemek ve analiz etmek için kullanılabilecek ölçümleri içerir. Ölçümler "Microsoft.AspNetCore.MemoryPool" adı altındadır.

Ölçümler ve bunların nasıl kullanılacağı hakkında bilgi için bkz. ASP.NET Core metrics.

Bellek havuzlarını yönetme

ASP.NET Core, gereksiz bellek bloklarını çıkararak bellek havuzlarını verimli bir şekilde kullanmanın yanı sıra yerleşik bir IMemoryPoolFactory ve bir uygulama sağlar. Bağımlılık ekleme yoluyla uygulamanızın kullanımına sunulmasını sağlar.

Aşağıdaki kod örneği, bellek havuzları oluşturmak için yerleşik bellek havuzu fabrika uygulamasını kullanan basit bir arka plan hizmetini gösterir. Bu havuzlar otomatik çıkarma özelliğinden yararlanır.

public class MyBackgroundService : BackgroundService
{
    private readonly MemoryPool<byte> _memoryPool;

    public MyBackgroundService(IMemoryPoolFactory<byte> factory)
    {
        _memoryPool = factory.Create();
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                await Task.Delay(20, stoppingToken);
                // do work that needs memory
                // consider checking _memoryPool.MaxBufferSize
                var rented = _memoryPool.Rent(100);
                rented.Dispose();
            }
            catch (OperationCanceledException)
            {
                return;
            }
        }
    }
}

Özel bir bellek havuzu fabrikası kullanmak için, IMemoryPoolFactory uygulayan bir sınıf oluşturun ve bunu, aşağıdaki örnekte olduğu gibi, bağımlılık enjeksiyonu ile kaydedin. Bu şekilde oluşturulan bellek havuzları, özel fabrikanızda benzer çıkarma mantığı uygulamadığınız sürece otomatik çıkarma özelliğinden yararlanmaz:

services.AddSingleton<IMemoryPoolFactory<byte>,
CustomMemoryPoolFactory>();

public class CustomMemoryPoolFactory : IMemoryPoolFactory<byte>
{
    public MemoryPool<byte> Create()
    {
        // Return a custom MemoryPool implementation
        // or the default, as is shown here.
        return MemoryPool<byte>.Shared;
    }
}

Bellek havuzu kullanırken havuzun MaxBufferSize öğesine özen gösterin.

Ek kaynaklar

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

Important

HTTP.sys ASP.NET Core Module ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.

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

  • Windows Authentication
  • Bağlantı noktası paylaşımı
  • 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 doğrudan İnternet ile iletişim kurar

  • İç dağıtım, Kestrel içinde kullanılamayan bir özellik gerektirir. Daha fazla bilgi için bkz Kestrel . HTTP.sys karşılaştırması

    HTTP.sys doğrudan iç ağ ile iletişim kurar

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 ü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'in gelecekteki bir sürümünde, HTTP/2'yi HTTP.sysile 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, Windows Insider derlemesinin kullanılmasını gerektirebilir.

HTTP/3, alt-svc başlığı aracılığıyla HTTP/1.1 veya HTTP/2'den bir yükseltme olarak tanımlanır. Bu, ilk isteğin HTTP/3'e geçmeden önce normalde HTTP/1.1 veya HTTP/2 kullanacağı anlamına gelir. Http.Sys alt-svc üst bilgisini otomatik olarak eklemez, bunun 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ı devreder. 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 belirteci/biletinin şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil, konak için Hizmet Asıl Adı (SPN) kaydedin.

HTTP.sys'i nasıl kullanılır?

ASP.NET Core uygulamasını HTTP.syskullanacak ş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ırmaları 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 IActionResult için ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yöntem, bir eylem yönteminde RequestSizeLimitAttribute özniteliğini kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Uygulama, bir isteği okumaya başladıktan sonra istek üzerinde sınır yapılandırmaya çalışırsa bir istisna atılır. Başka bir IsReadOnly özelliği, MaxRequestBodySize özelliğinin salt okunur bir durumda olup olmadığını belirtmek için kullanılabilir; bu, sınırı yapılandırmak için çok geç olduğu anlamına gelir.

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

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'de 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:

Konsol uygulaması profilini seçme

Windows Server yapılandırma

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

  2. Azure VM'ye dağıtım yaparken Network Güvenlik Grubu 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 New-SelfSignedCertificate PowerShell cmdlet 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 framework'e bağımlı bir dağıtımsa .NET, .NET Framework veya her ikisini de yükleyin (uygulama .NET Framework'ü hedefleyen .NET bir uygulamaysa).

    • .NET: Uygulama .NET gerektiriyorsa, .NET Downloads'den .NET Runtime 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 İndirmeler 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 http://localhost:5000 bağlar. 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 UrlPrefixes nasıl kullanılacağını 10.0.0.4 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.

    UrlPrefixes ayarları, UseUrls/urls/ASPNETCORE_URLS ayarlarını geçersiz kılar. Bu nedenle UseUrls, urls ve ASPNETCORE_URLS ortam değişkeninin avantajlarından biri, Kestrel ile HTTP.sys arasında geçiş yapmanın daha kolay olmasıdır.

    HTTP.sys HTTP Sunucu API'si UrlPrefix dize biçimlerini kullanır.

    Warning

    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 ana bilgisayar adları veya IP adresleri kullanın. Alt etki alanı için joker karakter bağlama (örneğin, *.mysub.com) üst etki alanının tamamını kontrol ediyorsanız bir güvenlik riski oluşturmaz (aksi takdirde, *.com güvenlik açığına açıktır). Daha fazla bilgi için RFC 9110: Bölüm 7.2: Konak ve :authority bölümüne bakın.

  6. Sunucudaki URL ön eklerini önceden kaydedin.

    HTTP.sys'i 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 Nitelikli 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ç URL reservation successfully added ile yanı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 İçinde:
      • Çözüm Gezgini'da uygulamaya sağ tıklayıp Properties'ı seçerek uygulamanın proje özelliklerini açın.
      • Paket sekmesini seçin.
      • Etiketler alanına oluşturduğunuz GUID'yi girin.
    • Visual Studio kullanmadığınızda:
      • Uygulamanın proje dosyasını açın.

      • Yeni veya mevcut bir <PropertyGroup> öğesine oluşturduğunuz GUID ile bir <PackageTags> özelliği ekleyin.

        <PropertyGroup>
          <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</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="{00001111-aaaa-2222-bbbb-3333cccc4444}"
    

    Bir sertifika kaydedildiğinde, araç SSL Certificate successfully added ile yanı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.

    1024'ten büyük bağlantı noktası numarasına sahip HTTP (HTTPS değil) kullanarak localhost'a bağlanırken uygulamayı çalıştırmak için yönetici ayrıcalıkları 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.

    Uygulamanın Dizin sayfasının yüklendiğini gösteren tarayıcı penceresi

Ara sunucu ve yük dengeleyici senaryoları

İnternet'ten veya şirket ağından gelen isteklerle etkileşim kuran HTTP.sys tarafından barındırılan 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. Proxy sunucuları ve yük dengeleyicilerle çalışmak için ASP.NET Core yapılandırma.

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

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

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

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

Trailers

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. DeclareTrailer çağrılırsa, yanıt üst bilgileri gönderilmeden önce çağrılmış olmalıdır.
  • AppendTrailer treyleri 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 iptal edildiği 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 yalnızca Windows üzerinde çalışan ASP.NET Core için web sunucusudur. HTTP.sys, Kestrel sunucusuna bir alternatiftir ve Kestrel tarafından sağlanmayan bazı özellikler sunar.

Important

HTTP.sys ASP.NET Core Module ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.

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

  • Windows Authentication
  • Bağlantı noktası paylaşımı
  • 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 doğrudan İnternet ile iletişim kurar

  • İç dağıtım, Kestrel içinde kullanılamayan bir özellik gerektirir. Daha fazla bilgi için bkz Kestrel . HTTP.sys karşılaştırması

    HTTP.sys doğrudan iç ağ ile iletişim kurar

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 ü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'in gelecekteki bir sürümünde, HTTP/2'yi HTTP.sysile 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ı

Kerberos kimlik doğrulama protokolüyle HTTP.sys çekirdek modu kimlik doğrulaması olarak devreder. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Bir makine hesabı, Active Directory'den alınan ve istemci tarafından sunucuya iletilen Kerberos belirteci/biletiyle kullanıcının kimliğinin doğrulanması için şifrenin çözülmesinde 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 nasıl kullanılır?

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

Konağı oluştururken gerekli öğeleri belirterek UseHttpSys 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 ayarları, kayıt defteri ayarları aracılığıyla yönetilir.

HTTP.sys seçenekleri

Property Description Default
AllowSynchronousIO Zaman uyumlu giriş/çıkış için HttpContext.Request.Body ve HttpContext.Response.Body'e 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, None, ve NTLM. None
EnableResponseCaching Uygun üst bilgiler içeren yanıtlar için çekirdek modu önbelleğe almayı deneme. Yanıt Set-Cookie, Vary veya Pragma üst bilgilerini içermeyebilir. bir Cache-Control başlık sarmalı ve ya shared-max-age veya max-age değeri ya da bir Expires başlığı içermelidir. true
Http503Verbosity İstekleri azaltma koşulları nedeniyle reddederken HTTP.sys'in davranışı. Http503VerbosityLevel.
Temel
MaxAccepts En fazla eş zamanlı kabul sayısı. 5 × Çevre.
İşlemciSayısı
MaxConnections Kabul edilecek 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
(machine-wide
setting)
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şlemlerinin özel durum atmalı mı yoksa normal şekilde tamamlanmalı mı olduğunu belirtin. 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 ile kaydedilecek öğeyi 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 IActionResult için ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yöntem, bir eylem yönteminde RequestSizeLimitAttribute özniteliğini kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

İstek okumaya başladıktan sonra uygulama bir isteğin sınırını yapılandırmaya çalışırsa bir istisna fırlatılır. Bir IsReadOnly özelliği, MaxRequestBodySize özelliğinin salt okunur durumda olup olmadığını belirtmek için kullanılabilir, bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.

Uygulama, MaxRequestBodySize değerini istek başına geçersiz kılacaksa, IHttpMaxRequestBodySizeFeature kullanın.

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'de 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:

Konsol uygulaması profilini seçme

Windows Server yapılandırma

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

  2. Azure VM'ye dağıtım yaparken Network Güvenlik Grubu 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 New-SelfSignedCertificate PowerShell cmdlet 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 framework'e bağımlı bir dağıtımsa .NET, .NET Framework veya her ikisini de yükleyin (uygulama .NET Framework'ü hedefleyen .NET bir uygulamaysa).

    • .NET: Uygulama .NET gerektiriyorsa, .NET Downloads'den .NET Runtime 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 İndirmeler 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 http://localhost:5000 bağlar. 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 UrlPrefixes nasıl kullanılacağını 10.0.0.4 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.

    UrlPrefixes ayarları, UseUrls/urls/ASPNETCORE_URLS ayarlarını geçersiz kılar. Bu nedenle UseUrls, urls ve ASPNETCORE_URLS ortam değişkeninin avantajlarından biri, Kestrel ile HTTP.sys arasında geçiş yapmanın daha kolay olmasıdır.

    HTTP.sys HTTP Sunucu API'si UrlPrefix dize biçimlerini kullanır.

    Warning

    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. Genel 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ı kontrol ettiğiniz sürece bir güvenlik riski oluşturmaz. Ancak, *.com güvensizdir ve güvenlik açığı içerebilir. Daha fazla bilgi için RFC 9110: Bölüm 7.2: Host ve :authority'ye bakın.

  6. Sunucudaki URL ön eklerini önceden kaydedin.

    HTTP.sys'i yapılandırmak için 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 Nitelikli Tekdüzen Kaynak Bulucu (URL). Joker karakterle bağlama 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ç URL reservation successfully added ile yanı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 İçinde:
      • Çözüm Gezgini'da uygulamaya sağ tıklayıp Properties'ı seçerek uygulamanın proje özelliklerini açın.
      • Paket sekmesini seçin.
      • Etiketler alanına oluşturduğunuz GUID'yi girin.
    • Visual Studio kullanmadığınızda:
      • Uygulamanın proje dosyasını açın.

      • Yeni veya mevcut bir <PropertyGroup> öğesine oluşturduğunuz GUID ile bir <PackageTags> özelliği ekleyin.

        <PropertyGroup>
          <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</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="{00001111-aaaa-2222-bbbb-3333cccc4444}"
    

    Bir sertifika kaydedildiğinde, araç SSL Certificate successfully added ile yanı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.

    1024'ten büyük bağlantı noktası numarasına sahip HTTP (HTTPS değil) kullanarak localhost'a bağlanırken uygulamayı çalıştırmak için yönetici ayrıcalıkları 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.

    Uygulamanın Dizin sayfasının yüklendiğini gösteren tarayıcı penceresi

Ara sunucu ve yük dengeleyici senaryoları

İnternet'ten veya şirket ağından gelen isteklerle etkileşim kuran HTTP.sys tarafından barındırılan 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. Proxy sunucuları ve yük dengeleyicilerle çalışmak için ASP.NET Core yapılandırma.

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

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

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

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

Trailers

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. DeclareTrailer çağrılırsa, yanıt üst bilgileri gönderilmeden önce çağrılmış olmalıdır.
  • AppendTrailer treyleri 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 iptal edildiği 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 yalnızca Windows üzerinde çalışan ASP.NET Core için web sunucusudur. HTTP.sys, Kestrel sunucusuna bir alternatiftir ve Kestrel tarafından sağlanmayan bazı özellikler sunar.

Important

HTTP.sys ASP.NET Core Module ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.

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

  • Windows Authentication
  • Bağlantı noktası paylaşımı
  • SNI ile HTTPS
  • TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
  • TLS üzerinden HTTP/3 (Windows 11 veya üzeri)
  • Doğrudan dosya iletimi
  • Yanıtları Önbelleğe Alma
  • WebSockets (Windows 8 veya üzeri)
  • Özelleştirilebilir güvenlik tanımlayıcıları

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 doğrudan İnternet ile iletişim kurar

  • İç dağıtım, Kestrel içinde kullanılamayan bir özellik gerektirir. Daha fazla bilgi için bkz Kestrel . HTTP.sys karşılaştırması

    HTTP.sys doğrudan iç ağ ile iletişim kurar

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 ü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'in gelecekteki bir sürümünde, HTTP/2'yi HTTP.sysile 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, Windows Insider derlemesinin kullanılmasını gerektirebilir.

HTTP/3, HTTP/1.1 veya HTTP/2'den bir yükseltme olarak alt-svc başlığı aracılığıyla keşfedilir. Bu, ilk isteğin HTTP/3'e geçmeden önce normalde HTTP/1.1 veya HTTP/2 kullanacağı anlamına gelir. Http.Sys, alt-svc üst bilgiyi otomatik olarak eklemez; bunun 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ı

Kerberos kimlik doğrulama protokolüyle HTTP.sys çekirdek modu kimlik doğrulaması olarak devreder. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Bir makine hesabı, Active Directory'den alınan ve istemci tarafından sunucuya iletilen Kerberos belirteci/biletiyle kullanıcının kimliğinin doğrulanması için şifrenin çözülmesinde kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.

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

Bazı senaryolarda, yüksek gecikme süresine sahip küçük yazma işlemlerinin yüksek hacimleri HTTP.sys üzerinde önemli bir performans etkisine neden olabilir. Bu etki, HTTP.sys implementasyonunda Pipe arabelleğin olmamasından kaynaklanır. Bu senaryolarda performansı geliştirmek için HTTP.sys'ye yanıt arabelleği desteği eklenmiştir. HttpSysOptions.EnableKernelResponseBuffering ayarını yaparak true tampona alma işlemini etkinleştirin. Yanıt arabelleği, senkron G/Ç veya bir kerede en fazla bir bekleyen yazma bulunan asenkron 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 bekletebilen 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 Nasıl Kullanılır

ASP.NET Core uygulamasını HTTP.syskullanacak ş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 IActionResult için ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yöntem, bir eylem yönteminde RequestSizeLimitAttribute özniteliğini kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Uygulama, isteği okumaya başladıktan sonra bir istekte sınırı ayarlamaya çalışırsa bir istisna olur. Bir IsReadOnly özelliği, MaxRequestBodySize özelliğinin salt okunur durumda olup olmadığını belirtmek için kullanılabilir; bu, sınırın yapılandırılması için artık çok geç olduğu anlamına gelir.

Uygulama istenirse MaxRequestBodySize'yi her istek için geçersiz kılmalıysa, IHttpMaxRequestBodySizeFeature kullanın:

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'de 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:

Konsol uygulaması profilini seçme

Windows Server yapılandırma

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

  2. Azure VM'ye dağıtım yaparken Network Güvenlik Grubu 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 New-SelfSignedCertificate PowerShell cmdlet 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 framework'e bağımlı bir dağıtımsa .NET, .NET Framework veya her ikisini de yükleyin (uygulama .NET Framework'ü hedefleyen .NET bir uygulamaysa).

    • .NET: Uygulama .NET gerektiriyorsa, .NET Downloads'den .NET Runtime 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 İndirmeler 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 http://localhost:5000 bağlar. 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 UrlPrefixes nasıl kullanılacağını 10.0.0.4 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.

    UrlPrefixes ayarları, UseUrls/urls/ASPNETCORE_URLS ayarlarını geçersiz kılar. Bu nedenle, UseUrls, urls ve ASPNETCORE_URLS ortam değişkeninin avantajlarından biri, Kestrel ve HTTP.sys arasında geçiş yapmanın daha kolay olmasıdır.

    HTTP.sys URL ön eklerinde iki tür joker karakter tanır:

    • * , geri dönüş bağlaması olarak da bilinen zayıf bir bağlamadır. URL ön eki ise http://*:5000ve başka bir şey 5000 numaralı bağlantı noktasına bağlıysa, bu bağlama kullanılmaz.
    • + güçlü bir bağlamadır. URL ön eki ise http://+:5000, bu bağlama diğer bağlantı noktası 5000 bağlamalarından önce kullanılır.

    Daha fazla bilgi için bkz . UrlPrefix Dizeleri.

    Warning

    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 ana bilgisayar adları veya IP adresleri kullanın. Alt etki alanı için joker karakter bağlama (örneğin, *.mysub.com) üst etki alanının tamamını kontrol ediyorsanız bir güvenlik riski oluşturmaz (aksi takdirde, *.com güvenlik açığına açıktır). Daha fazla bilgi için RFC 9110: Bölüm 7.2: Konak ve :authority bölümüne bakın.

    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, Kestrel ve HTTP.sys sunucuları için dinleme bağlantı noktalarını belirten yapılandırma anahtarlarıdır. Bu anahtarlar, DOTNET_ veya ASPNETCORE_ ön ekleriyle tanımlanan ortam değişkenleri olarak ya da appsettings.json gibi baş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'i 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 Nitelikli 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 Properties'ı seçerek uygulamanın proje özelliklerini açın.
      • Paket sekmesini seçin.
      • Etiketler alanına oluşturduğunuz GUID'yi girin.
    • Visual Studio kullanmadığınızda:
      • Uygulamanın proje dosyasını açın.

      • Yeni veya mevcut bir <PropertyGroup> üzerine oluşturduğunuz GUID ile bir <PackageTags> özelliği ekleyin.

        <PropertyGroup>
          <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags>
        </PropertyGroup>
        

    Aşağıdaki örnekte:

    • Sunucunun yerel IP adresi şeklindedir 10.0.0.4.
    • Çevrimiçi bir rastgele GUID oluşturucu, appid değerini sağlar.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
    

    Bir sertifika kaydedildiğinde, araç SSL Certificate successfully added ile cevap 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.

    1024'ten büyük bağlantı noktası numarasına sahip HTTP (HTTPS değil) kullanarak localhost'a bağlanırken uygulamayı çalıştırmak için yönetici ayrıcalıkları 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.

    Uygulamanın Dizin sayfasının yüklendiğini gösteren tarayıcı penceresi

Ara sunucu ve yük dengeleyici senaryoları

İnternet'ten veya şirket ağından gelen isteklerle etkileşim kuran HTTP.sys tarafından barındırılan 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. Proxy sunucuları ve yük dengeleyicilerle çalışmak için ASP.NET Core 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.
  • Windows 10 sürüm 2004, Windows Server 2022 veya üzeri gerektirir.
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](/dotnet/api/microsoft.aspnetcore.server.httpsys.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'daki ek HTTP/2 özellikleri, yanıt fragmanları ve sıfırlama çerçeveleri gönderme desteği de dahil olmak üzere gRPC'yi destekler.

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

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

Trailers

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. DeclareTrailer çağrılırsa, yanıt üst bilgileri gönderilmeden önce olmalıdır.
  • AppendTrailer traileri 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ği iptal edilmiş 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.

Tracing

HTTP.sys izlemeleri nasıl alınır hakkında bilgi için bkz HTTP.sys Yönetilebilirlik Senaryoları.

Ek kaynaklar