Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
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.
İç 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, 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:
- Windows Server 2016/Windows 10 veya üzeri
- Uygulama Katmanı Protokolü Anlaşması (ALPN) bağlantısı
- TLS 1.2 veya üzeri bağlantısı
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:
- Windows Server 2022/Windows 11 veya üzeri
- Url
httpsbağlaması kullanılır. - EtkinleştirHttp3 kayıt defteri anahtarı ayarlanır.
Ö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:
Windows Server yapılandırma
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.
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.
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.
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.
Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.
Varsayılan olarak, ASP.NET Core
http://localhost:5000bağlar. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:- UseUrls
-
urlskomut satırı bağımsız değişkeni -
ASPNETCORE_URLSortam 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.4gö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.UrlPrefixesiçindeki ayarlar,UseUrls/urls/ASPNETCORE_URLSayarlarını geçersiz kılar. Bu nedenle,UseUrls,urlsveASPNETCORE_URLSortam 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 isehttp://*: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 isehttp://+: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/vehttp://+: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*.comyerine). 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_veyaASPNETCORE_ön ekleriyle tanımlanan ortam değişkenleri olarak veya doğrudanappsettings.jsongibi 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;8081Yukarı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.
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=UsersBir URL kaydedildiğinde, araç ile
URL reservation successfully addedyanıt verir.Kayıtlı URL'yi silmek için komutunu
delete urlaclkullanın:netsh http delete urlacl url=<URL>-
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,
appiddeğ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 addedile cevap verir.Sertifika kaydını silmek için komutunu
delete sslcertkullanın:netsh http delete sslcert ipport=<IP>:<PORT>netsh.exe için başvuru belgeleri:
-
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.
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. -
DeclareTrailerverilen römork adını yanıt üst bilgisineTrailerekler. 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. -
AppendTrailertreyleri 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
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.
İç 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, 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:
- Windows Server 2016/Windows 10 veya üzeri
- Uygulama Katmanı Protokolü Anlaşması (ALPN) bağlantısı
- TLS 1.2 veya üzeri bağlantısı
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:
- Windows Server 2022/Windows 11 veya üzeri
- Url
httpsbağlaması kullanılır. - EtkinleştirHttp3 kayıt defteri anahtarı ayarlanır.
Ö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:
Windows Server yapılandırma
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.
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.
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.
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.
Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.
Varsayılan olarak, ASP.NET Core
http://localhost:5000bağlar. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:- UseUrls
-
urlskomut satırı bağımsız değişkeni -
ASPNETCORE_URLSortam 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.4gö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.UrlPrefixesayarları,UseUrls/urls/ASPNETCORE_URLSayarlarını geçersiz kılar. Bu nedenleUseUrls,urlsveASPNETCORE_URLSortam 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/vehttp://+: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,*.comgü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.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=UsersBir URL kaydedildiğinde, araç
URL reservation successfully addedile yanıt verir.Kayıtlı URL'yi silmek için komutunu
delete urlaclkullanın:netsh http delete urlacl url=<URL>-
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
appidsağ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 addedile yanıt verir.Sertifika kaydını silmek için komutunu
delete sslcertkullanın:netsh http delete sslcert ipport=<IP>:<PORT>netsh.exe için başvuru belgeleri:
-
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.
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. -
DeclareTrailerverilen römork adını yanıt üst bilgisineTrailerekler. 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. -
AppendTrailertreyleri 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
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.
İç 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, 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:
- Windows Server 2016/Windows 10 veya üzeri
- Uygulama Katmanı Protokolü Anlaşması (ALPN) bağlantısı
- TLS 1.2 veya üzeri bağlantısı
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:
Windows Server yapılandırma
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.
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.
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.
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.
Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.
Varsayılan olarak, ASP.NET Core
http://localhost:5000bağlar. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:- UseUrls
-
urlskomut satırı bağımsız değişkeni -
ASPNETCORE_URLSortam 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.4gö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.UrlPrefixesayarları,UseUrls/urls/ASPNETCORE_URLSayarlarını geçersiz kılar. Bu nedenleUseUrls,urlsveASPNETCORE_URLSortam 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/vehttp://+: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,*.comgü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.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=UsersBir URL kaydedildiğinde, araç
URL reservation successfully addedile yanıt verir.Kayıtlı URL'yi silmek için komutunu
delete urlaclkullanın:netsh http delete urlacl url=<URL>-
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
appidsağ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 addedile yanıt verir.Sertifika kaydını silmek için komutunu
delete sslcertkullanın:netsh http delete sslcert ipport=<IP>:<PORT>netsh.exe için başvuru belgeleri:
-
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.
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. -
DeclareTrailerverilen römork adını yanıt üst bilgisineTrailerekler. 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. -
AppendTrailertreyleri 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
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.
İç 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, 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:
- Windows Server 2016/Windows 10 veya üzeri
- Uygulama Katmanı Protokolü Anlaşması (ALPN) bağlantısı
- TLS 1.2 veya üzeri bağlantısı
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:
- Windows Server 2022/Windows 11 veya üzeri
- Url
httpsbağlaması kullanılır. - EtkinleştirHttp3 kayıt defteri anahtarı ayarlanır.
Ö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:
Windows Server yapılandırma
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.
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.
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.
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.
Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.
Varsayılan olarak, ASP.NET Core
http://localhost:5000bağlar. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:- UseUrls
-
urlskomut satırı bağımsız değişkeni -
ASPNETCORE_URLSortam 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.4gö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.UrlPrefixesayarları,UseUrls/urls/ASPNETCORE_URLSayarlarını geçersiz kılar. Bu nedenle,UseUrls,urlsveASPNETCORE_URLSortam 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 isehttp://*: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 isehttp://+: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/vehttp://+: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,*.comgü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_veyaASPNETCORE_ön ekleriyle tanımlanan ortam değişkenleri olarak ya daappsettings.jsongibi 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;8081Yukarı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.
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=UsersBir URL kaydedildiğinde, araç ile
URL reservation successfully addedyanıt verir.Kayıtlı URL'yi silmek için komutunu
delete urlaclkullanın:netsh http delete urlacl url=<URL>-
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,
appiddeğ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 addedile cevap verir.Sertifika kaydını silmek için komutunu
delete sslcertkullanın:netsh http delete sslcert ipport=<IP>:<PORT>netsh.exe için başvuru belgeleri:
-
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.
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. -
DeclareTrailerverilen römork adını yanıt üst bilgisineTrailerekler. 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. -
AppendTrailertraileri 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
ASP.NET Core