ASP.NET Core'da HTTP.sys web sunucusu uygulaması
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Tarafından Tom Dykstra ve Chris Ross
HTTP.sys, ASP.NET Core için yalnızca Windows üzerinde çalışan bir web sunucusudur. HTTP.sys sunucuya Kestrel alternatiftir ve sağlamayan Kestrel bazı özellikler sunar.
Önemli
HTTP.sys ASP.NET Core Modülü ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.
HTTP.sys aşağıdaki özellikleri destekler:
- Windows Kimlik Doğrulaması
- Bağlantı noktası paylaşma
- SNI ile HTTPS
- TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
- Doğrudan dosya iletimi
- Yanıtları Önbelleğe Alma
- WebSockets (Windows 8 veya üzeri)
Desteklenen Windows sürümleri:
- Windows 7 veya üzeri
- Windows Server 2008 R2 veya üzeri
Örnek kodu görüntüleme veya indirme (indirme)
HTTP.sys ne zaman kullanılır?
HTTP.sys, aşağıdaki durumlarda dağıtımlar için kullanışlıdır:
IIS kullanmadan sunucuyu doğrudan İnternet'te kullanıma sunmanız gerekir.
İç dağıtım, içinde Kestrelkullanı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.Protocol HTTP/2
bildirir.
HTTP/2 varsayılan olarak etkinleştirilir. HTTP/2 bağlantısı kurulmazsa, bağlantı HTTP/1.1'e geri döner. Windows'un gelecekteki bir sürümünde HTTP/2 yapılandırma bayrakları kullanılabilir olacak ve HTTP.sys ile HTTP/2'yi devre dışı bırakabileceksiniz.
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
https
bağlaması kullanılır. - EtkinleştirHttp3 kayıt defteri anahtarı ayarlanır.
Önceki Windows 11 Derleme sürümleri bir Windows Insider derlemesinin kullanılmasını gerektirebilir.
HTTP/3, üst bilgi aracılığıyla alt-svc
HTTP/1.1 veya HTTP/2'den yükseltme olarak bulunur. Bu, ilk isteğin HTTP/3'e geçmeden önce normalde HTTP/1.1 veya HTTP/2 kullanacağı anlamına gelir. Http.Sys üst bilgiyi otomatik olarak eklemez alt-svc
, uygulama tarafından eklenmesi gerekir. Aşağıdaki kod, yanıt üst bilgisini ekleyen alt-svc
bir ara yazılım örneğidir.
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
Yukarıdaki kodu istek işlem hattının başına yerleştirin.
Http.Sys, istemciye HTTP/3'ün kullanılabilir olduğunu bildirmek için yanıt üst bilgisi yerine AltSvc HTTP/2 protokol iletisi göndermeyi de destekler. Bkz. EnableAltSvc kayıt defteri anahtarı. Bunun için IP adresleri yerine konak adlarını kullanan netsh sslcert bağlamaları gerekir.
Kerberos ile çekirdek modu kimlik doğrulaması
Kerberos kimlik doğrulama protokolüyle çekirdek modu kimlik doğrulaması için temsilciler HTTP.sys. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.
Çekirdek modu yanıt arabelleği desteği
Bazı senaryolarda, yüksek gecikme süresine sahip yüksek hacimli küçük yazma işlemleri üzerinde önemli performans etkisine HTTP.sys
neden olabilir. Bu etki, uygulamada arabellek Pipe olmamasından HTTP.sys
kaynaklanır. Bu senaryolarda performansı geliştirmek için yanıt arabelleği desteğine HTTP.sys
dahil edilir. HttpSysOptions.EnableKernelResponseBuffering ayarını olarak true
ayarlayarak arabelleğe almayı etkinleştirin.
Yanıt arabelleği, zaman uyumlu G/Ç veya bir kerede birden fazla bekleyen yazma olmayan zaman uyumsuz G/Ç kullanan bir uygulama tarafından etkinleştirilmelidir. Bu senaryolarda yanıt arabelleği oluşturma, yüksek gecikme süreli bağlantılarda aktarım hızını önemli ölçüde iyileştirebilir.
Zaman uyumsuz G/Ç kullanan ve aynı anda birden fazla yazma işlemi bekleyen uygulamalar bu bayrağı kullanmamalıdır. Bu bayrağın etkinleştirilmesi HTTP.Sys tarafından daha yüksek CPU ve bellek kullanımına neden olabilir.
HTTP.sys kullanma
ASP.NET Core uygulamasını HTTP.sys kullanacak şekilde yapılandırma
Konağı UseHttpSys oluştururken gerekli HttpSysOptionsolan herhangi bir öğesini belirterek uzantı yöntemini çağırın. Aşağıdaki örnek, seçenekleri varsayılan değerlerine ayarlar:
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30_000_000;
options.UrlPrefixes.Add("http://localhost:5005");
});
builder.Services.AddRazorPages();
var app = builder.Build();
Ek HTTP.sys yapılandırması kayıt defteri ayarları aracılığıyla işlenir.
HTTP.sys seçenekleri hakkında daha fazla bilgi için bkz HttpSysOptions. .
MaxRequestBodySize
Bayt cinsinden herhangi bir istek gövdesinin izin verilen en büyük boyutu. olarak null
ayarlandığında, istek gövdesi boyutu üst sınırı sınırsızdır. Bu sınırın, her zaman sınırsız olan yükseltilmiş bağlantılar üzerinde hiçbir etkisi yoktur.
Tek bir ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için IActionResult
önerilen yöntem, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Uygulama isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa bir özel durum oluşur. Özelliğin IsReadOnly
MaxRequestBodySize
salt okunur durumda olup olmadığını belirtmek için bir özellik kullanılabilir; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.
Uygulamanın istek başına geçersiz kılması MaxRequestBodySize gerekiyorsa kullanın IHttpMaxRequestBodySizeFeature:
app.Use((context, next) =>
{
context.Features.GetRequiredFeature<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var server = context.RequestServices
.GetRequiredService<IServer>();
var serverAddressesFeature = server.Features
.GetRequiredFeature<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature.Addresses);
var loggerFactory = context.RequestServices
.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
logger.LogInformation("Addresses: {addresses}", addresses);
return next(context);
});
Visual Studio kullanıyorsanız, uygulamanın IIS veya IIS Express'i çalıştıracak şekilde yapılandırılmadığından emin olun.
Visual Studio'da varsayılan başlatma profili IIS Express içindir. Projeyi konsol uygulaması olarak çalıştırmak için, aşağıdaki ekran görüntüsünde gösterildiği gibi seçili profili el ile değiştirin:
Windows Server'ı yapılandırma
Uygulama için açılacak bağlantı noktalarını belirleyin ve trafiğin HTTP.sys ulaşmasına izin vermek üzere güvenlik duvarı bağlantı noktalarını açmak için Windows Güvenlik Duvarı veya New-NetFirewallRule PowerShell cmdlet'ini kullanın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.
Azure VM'sine dağıtım yaparken Ağ Güvenlik Grubu'ndaki bağlantı noktalarını açın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.
Gerekirse X.509 sertifikalarını alın ve yükleyin.
Windows'da, New-SelfSignedCertificate PowerShell cmdlet'ini kullanarak otomatik olarak imzalanan sertifikalar oluşturun. Desteklenmeyen bir örnek için bkz . UpdateIISExpressSSLForChrome.ps1.
Sunucunun Yerel Makine>Kişisel deposuna otomatik olarak imzalanan veya CA imzalı sertifikalar yükleyin.
Uygulama çerçeveye bağımlı bir dağıtımsa .NET Core, .NET Framework veya her ikisini birden yükleyin (uygulama .NET Framework'ü hedefleyen bir .NET Core uygulamasıysa).
- .NET Core: Uygulama .NET Core gerektiriyorsa .NET Core İndirmeleri'nden .NET Core Çalışma Zamanı yükleyicisini alın ve çalıştırın. Tam SDK'yi sunucuya yüklemeyin.
- .NET Framework: Uygulama .NET Framework gerektiriyorsa , .NET Framework yükleme kılavuzuna bakın. Gerekli .NET Framework'ü yükleyin. En son .NET Framework yükleyicisine .NET Core İndirmeleri sayfasından ulaşabilirsiniz.
Uygulama bağımsız bir dağıtımsa, uygulama çalışma zamanını dağıtımına ekler. Sunucuda çerçeve yüklemesi gerekmez.
Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.
Varsayılan olarak, ASP.NET Core öğesine
http://localhost:5000
bağlanır. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:- UseUrls
urls
komut satırı bağımsız değişkeniASPNETCORE_URLS
ortam değişkeni- UrlPrefixes
Aşağıdaki kod örneği, 443 numaralı bağlantı noktasında sunucunun yerel IP adresiyle
10.0.0.4
nasıl kullanılacağını UrlPrefixes gösterir:var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); builder.Services.AddRazorPages(); var app = builder.Build();
Bunun bir avantajı
UrlPrefixes
, hatalı biçimlendirilmiş ön ekler için hemen bir hata iletisi oluşturulmasıdır.Geçersiz kılma/
ASPNETCORE_URLS
UseUrls
urls
/ayarlarındakiUrlPrefixes
ayarlar. Bu nedenle , ve ortam değişkenininUseUrls
urls
ASPNETCORE_URLS
avantajlarından biri ve HTTP.sys arasında Kestrel geçiş yapmak 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://*:5000
ve 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.
Uyarı
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 konak adları veya IP adresleri kullanın. Alt etki alanı joker karakter bağlaması (örneğin,*.mysub.com
) üst etki alanının tamamını denetlerseniz (*.com
güvenlik açığı olan yerine) bir güvenlik riski değildir. Daha fazla bilgi için bkz . RFC 9110: Bölüm 7.2: Konak ve :authority.Uygulamalara ve kapsayıcılara genellikle konak veya yol gibi ek kısıtlamalar olmadan yalnızca 80 numaralı bağlantı noktası gibi dinlemeleri için bir bağlantı noktası verilir. HTTP_PORTS ve HTTPS_PORTS, ve HTTP.sys sunucuları için Kestrel dinleme bağlantı noktalarını belirten yapılandırma anahtarlarıdır. Bu anahtarlar, veya
ASPNETCORE_
ön ekleriyleDOTNET_
tanımlanan ortam değişkenleri olarak belirtilebilir veya gibiappsettings.json
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.
Sunucudaki URL ön eklerini önceden kaydedin.
HTTP.sys yapılandırmaya yönelik yerleşik araç netsh.exe. netsh.exe, URL ön eklerini ayırmak ve X.509 sertifikaları atamak için kullanılır. Araç yönetici ayrıcalıkları gerektirir.
Uygulamaya URL'leri kaydetmek için netsh.exe aracını kullanın:
netsh http add urlacl url=<URL> user=<USER>
<URL>
: Tam Tekdüzen Kaynak Bulucu (URL). Joker karakter bağlaması kullanmayın. Geçerli bir ana bilgisayar adı veya yerel IP adresi kullanın. URL sonunda bir eğik çizgi içermelidir.<USER>
: Kullanıcı veya kullanıcı grubu adını belirtir.
Aşağıdaki örnekte, sunucunun yerel IP adresi şöyledir
10.0.0.4
:netsh http add urlacl url=https://10.0.0.4:443/ user=Users
Bir URL kaydedildiğinde, araç ile
URL reservation successfully added
yanıt verir.Kayıtlı URL'yi silmek için komutunu
delete urlacl
kullanı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 Özellikler'i seçerek uygulamanın proje özelliklerini açın.
- Paket sekmesini seçin.
- Etiketler alanına oluşturduğunuz GUID'yi girin.
- Visual Studio'yu kullanmadığınızda:
Uygulamanın proje dosyasını açın.
<PackageTags>
Oluşturduğunuz GUID ile yeni veya var olan<PropertyGroup>
bir özelliğe özellik ekleyin:<PropertyGroup> <PackageTags>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ç ile
SSL Certificate successfully added
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:
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. ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma.
IHttpSysRequestTimingFeature ile ayrıntılı zamanlama bilgilerini alma
IHttpSysRequestTimingFeature , istekler için ayrıntılı zamanlama bilgileri sağlar:
- Zaman damgaları QueryPerformanceCounter kullanılarak elde edilir.
- Zaman damgası sıklığı QueryPerformanceFrequency aracılığıyla elde edilebilir.
- Zamanlamanın dizini HttpSysRequestTimingType'a yayınlanabilir ve zamanlamanın neyi temsil ettiği öğrenilebilir.
- Geçerli istek için zamanlama kullanılamıyorsa değer 0 olabilir.
- Windows 10 sürüm 2004, Windows Server 2022 veya üzerini 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 , 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 üzeri, Windows Server 2022 Derleme 20348 veya üzeri.
- TLS 1.2 veya üzeri bağlantı.
Römork
HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Yukarıdaki örnek kodda:
SupportsTrailers
, römorkların yanıt için desteklendiğini güvence altına alır.DeclareTrailer
verilen römork adını yanıt üst bilgisineTrailer
ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsaDeclareTrailer
, yanıt üst bilgileri gönderilmeden önce olmalıdır.AppendTrailer
römorku ekler.
Reset
Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR
. HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.
İzleme
HTTP.sys izlemeleri alma hakkında bilgi için bkz . yönetilebilirlik senaryoları HTTP.sys.
Ek kaynaklar
HTTP.sys, ASP.NET Core için yalnızca Windows üzerinde çalışan bir web sunucusudur. HTTP.sys sunucuya Kestrel alternatiftir ve sağlamayan Kestrel bazı özellikler sunar.
Önemli
HTTP.sys ASP.NET Core Modülü ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.
HTTP.sys aşağıdaki özellikleri destekler:
- Windows Kimlik Doğrulaması
- Bağlantı noktası paylaşma
- SNI ile HTTPS
- TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
- Doğrudan dosya iletimi
- Yanıtları Önbelleğe Alma
- WebSockets (Windows 8 veya üzeri)
Desteklenen Windows sürümleri:
- Windows 7 veya üzeri
- Windows Server 2008 R2 veya üzeri
Örnek kodu görüntüleme veya indirme (indirme)
HTTP.sys ne zaman kullanılır?
HTTP.sys, aşağıdaki durumlarda dağıtımlar için kullanışlıdır:
IIS kullanmadan sunucuyu doğrudan İnternet'te kullanıma sunmanız gerekir.
İç dağıtım, içinde Kestrelkullanı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.Protocol HTTP/2
bildirir.
HTTP/2 varsayılan olarak etkinleştirilir. HTTP/2 bağlantısı kurulmazsa, bağlantı HTTP/1.1'e geri döner. Windows'un gelecekteki bir sürümünde HTTP/2 yapılandırma bayrakları kullanılabilir olacak ve HTTP.sys ile HTTP/2'yi devre dışı bırakabileceksiniz.
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
https
bağlaması kullanılır. - EtkinleştirHttp3 kayıt defteri anahtarı ayarlanır.
Önceki Windows 11 Derleme sürümleri bir Windows Insider derlemesinin kullanılmasını gerektirebilir.
HTTP/3, üst bilgi aracılığıyla alt-svc
HTTP/1.1 veya HTTP/2'den yükseltme olarak bulunur. Bu, ilk isteğin HTTP/3'e geçmeden önce normalde HTTP/1.1 veya HTTP/2 kullanacağı anlamına gelir. Http.Sys üst bilgiyi otomatik olarak eklemez alt-svc
, uygulama tarafından eklenmesi gerekir. Aşağıdaki kod, yanıt üst bilgisini ekleyen alt-svc
bir ara yazılım örneğidir.
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
Yukarıdaki kodu istek işlem hattının başına yerleştirin.
Http.Sys, istemciye HTTP/3'ün kullanılabilir olduğunu bildirmek için yanıt üst bilgisi yerine AltSvc HTTP/2 protokol iletisi göndermeyi de destekler. Bkz. EnableAltSvc kayıt defteri anahtarı. Bunun için IP adresleri yerine konak adlarını kullanan netsh sslcert bağlamaları gerekir.
Kerberos ile çekirdek modu kimlik doğrulaması
Kerberos kimlik doğrulama protokolüyle çekirdek modu kimlik doğrulaması için temsilciler HTTP.sys. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.
HTTP.sys kullanma
ASP.NET Core uygulamasını HTTP.sys kullanacak şekilde yapılandırma
Konağı UseHttpSys oluştururken gerekli HttpSysOptionsolan herhangi bir öğesini belirterek uzantı yöntemini çağırın. Aşağıdaki örnek, seçenekleri varsayılan değerlerine ayarlar:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
Ek HTTP.sys yapılandırması kayıt defteri ayarları aracılığıyla işlenir.
HTTP.sys seçenekleri hakkında daha fazla bilgi için bkz HttpSysOptions. .
MaxRequestBodySize
Bayt cinsinden herhangi bir istek gövdesinin izin verilen en büyük boyutu. olarak null
ayarlandığında, istek gövdesi boyutu üst sınırı sınırsızdır. Bu sınırın, her zaman sınırsız olan yükseltilmiş bağlantılar üzerinde hiçbir etkisi yoktur.
Tek bir ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için IActionResult
önerilen yöntem, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Uygulama isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa bir özel durum oluşur. Özelliğin IsReadOnly
MaxRequestBodySize
salt okunur durumda olup olmadığını belirtmek için bir özellik kullanılabilir; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.
Uygulamanın istek başına geçersiz kılması MaxRequestBodySize gerekiyorsa kullanın IHttpMaxRequestBodySizeFeature:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Visual Studio kullanıyorsanız, uygulamanın IIS veya IIS Express'i çalıştıracak şekilde yapılandırılmadığından emin olun.
Visual Studio'da varsayılan başlatma profili IIS Express içindir. Projeyi konsol uygulaması olarak çalıştırmak için, aşağıdaki ekran görüntüsünde gösterildiği gibi seçili profili el ile değiştirin:
Windows Server'ı yapılandırma
Uygulama için açılacak bağlantı noktalarını belirleyin ve trafiğin HTTP.sys ulaşmasına izin vermek üzere güvenlik duvarı bağlantı noktalarını açmak için Windows Güvenlik Duvarı veya New-NetFirewallRule PowerShell cmdlet'ini kullanın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.
Azure VM'sine dağıtım yaparken Ağ Güvenlik Grubu'ndaki bağlantı noktalarını açın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.
Gerekirse X.509 sertifikalarını alın ve yükleyin.
Windows'da, New-SelfSignedCertificate PowerShell cmdlet'ini kullanarak otomatik olarak imzalanan sertifikalar oluşturun. Desteklenmeyen bir örnek için bkz . UpdateIISExpressSSLForChrome.ps1.
Sunucunun Yerel Makine>Kişisel deposuna otomatik olarak imzalanan veya CA imzalı sertifikalar yükleyin.
Uygulama çerçeveye bağımlı bir dağıtımsa .NET Core, .NET Framework veya her ikisini birden yükleyin (uygulama .NET Framework'ü hedefleyen bir .NET Core uygulamasıysa).
- .NET Core: Uygulama .NET Core gerektiriyorsa .NET Core İndirmeleri'nden .NET Core Çalışma Zamanı yükleyicisini alın ve çalıştırın. Tam SDK'yi sunucuya yüklemeyin.
- .NET Framework: Uygulama .NET Framework gerektiriyorsa , .NET Framework yükleme kılavuzuna bakın. Gerekli .NET Framework'ü yükleyin. En son .NET Framework yükleyicisine .NET Core İndirmeleri sayfasından ulaşabilirsiniz.
Uygulama bağımsız bir dağıtımsa, uygulama çalışma zamanını dağıtımına ekler. Sunucuda çerçeve yüklemesi gerekmez.
Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.
Varsayılan olarak, ASP.NET Core öğesine
http://localhost:5000
bağlanır. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:- UseUrls
urls
komut satırı bağımsız değişkeniASPNETCORE_URLS
ortam değişkeni- UrlPrefixes
Aşağıdaki kod örneği, 443 numaralı bağlantı noktasında sunucunun yerel IP adresiyle
10.0.0.4
nasıl kullanılacağını UrlPrefixes gösterir:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); webBuilder.UseStartup<Startup>(); });
Bunun bir avantajı
UrlPrefixes
, hatalı biçimlendirilmiş ön ekler için hemen bir hata iletisi oluşturulmasıdır.Geçersiz kılma/
ASPNETCORE_URLS
UseUrls
urls
/ayarlarındakiUrlPrefixes
ayarlar. Bu nedenle , ve ortam değişkenininUseUrls
urls
ASPNETCORE_URLS
avantajlarından biri ve HTTP.sys arasında Kestrel geçiş yapmak daha kolay olmasıdır.HTTP.sys HTTP Sunucu API'si UrlPrefix dize biçimlerini kullanır.
Uyarı
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 konak adları veya IP adresleri kullanın. Alt etki alanı joker karakter bağlaması (örneğin,*.mysub.com
) üst etki alanının tamamını denetlerseniz (*.com
güvenlik açığı olan yerine) bir güvenlik riski değildir. Daha fazla bilgi için bkz . RFC 9110: Bölüm 7.2: Konak ve :authority.Sunucudaki URL ön eklerini önceden kaydedin.
HTTP.sys yapılandırmaya yönelik yerleşik araç netsh.exe. netsh.exe, URL ön eklerini ayırmak ve X.509 sertifikaları atamak için kullanılır. Araç yönetici ayrıcalıkları gerektirir.
Uygulamaya URL'leri kaydetmek için netsh.exe aracını kullanın:
netsh http add urlacl url=<URL> user=<USER>
<URL>
: Tam Tekdüzen Kaynak Bulucu (URL). Joker karakter bağlaması kullanmayın. Geçerli bir ana bilgisayar adı veya yerel IP adresi kullanın. URL sonunda bir eğik çizgi içermelidir.<USER>
: Kullanıcı veya kullanıcı grubu adını belirtir.
Aşağıdaki örnekte, sunucunun yerel IP adresi şöyledir
10.0.0.4
:netsh http add urlacl url=https://10.0.0.4:443/ user=Users
Bir URL kaydedildiğinde, araç ile
URL reservation successfully added
yanıt verir.Kayıtlı URL'yi silmek için komutunu
delete urlacl
kullanı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 Özellikler'i seçerek uygulamanın proje özelliklerini açın.
- Paket sekmesini seçin.
- Etiketler alanına oluşturduğunuz GUID'yi girin.
- Visual Studio'yu kullanmadığınızda:
Uygulamanın proje dosyasını açın.
<PackageTags>
Oluşturduğunuz GUID ile yeni veya var olan<PropertyGroup>
bir özelliğe özellik ekleyin:<PropertyGroup> <PackageTags>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ç ile
SSL Certificate successfully added
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:
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. ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma.
gRPC'yi desteklemek için gelişmiş HTTP/2 özellikleri
HTTP.sys'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 üzeri, Windows Server 2022 Derleme 20348 veya üzeri.
- TLS 1.2 veya üzeri bağlantı.
Römork
HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Yukarıdaki örnek kodda:
SupportsTrailers
, römorkların yanıt için desteklendiğini güvence altına alır.DeclareTrailer
verilen römork adını yanıt üst bilgisineTrailer
ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsaDeclareTrailer
, yanıt üst bilgileri gönderilmeden önce olmalıdır.AppendTrailer
römorku ekler.
Reset
Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR
. HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.
Ek kaynaklar
HTTP.sys, ASP.NET Core için yalnızca Windows üzerinde çalışan bir web sunucusudur. HTTP.sys sunucuya Kestrel alternatiftir ve sağlamayan Kestrel bazı özellikler sunar.
Önemli
HTTP.sys ASP.NET Core Modülü ile uyumlu değildir ve IIS veya IIS Express ile kullanılamaz.
HTTP.sys aşağıdaki özellikleri destekler:
- Windows Kimlik Doğrulaması
- Bağlantı noktası paylaşma
- SNI ile HTTPS
- TLS üzerinden HTTP/2 (Windows 10 veya üzeri)
- Doğrudan dosya iletimi
- Yanıtları Önbelleğe Alma
- WebSockets (Windows 8 veya üzeri)
Desteklenen Windows sürümleri:
- Windows 7 veya üzeri
- Windows Server 2008 R2 veya üzeri
Örnek kodu görüntüleme veya indirme (indirme)
HTTP.sys ne zaman kullanılır?
HTTP.sys, aşağıdaki durumlarda dağıtımlar için kullanışlıdır:
IIS kullanmadan sunucuyu doğrudan İnternet'te kullanıma sunmanız gerekir.
İç dağıtım, içinde Kestrelkullanı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.Protocol HTTP/2
bildirir.
HTTP/2 varsayılan olarak etkinleştirilir. HTTP/2 bağlantısı kurulmazsa, bağlantı HTTP/1.1'e geri döner. Windows'un gelecekteki bir sürümünde HTTP/2 yapılandırma bayrakları kullanılabilir olacak ve HTTP.sys ile HTTP/2'yi devre dışı bırakabileceksiniz.
Kerberos ile çekirdek modu kimlik doğrulaması
Kerberos kimlik doğrulama protokolüyle çekirdek modu kimlik doğrulaması için temsilciler HTTP.sys. Kullanıcı modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.
HTTP.sys kullanma
ASP.NET Core uygulamasını HTTP.sys kullanacak şekilde yapılandırma
Konağı UseHttpSys oluştururken gerekli HttpSysOptionsolan herhangi bir öğesini belirterek uzantı yöntemini çağırın. Aşağıdaki örnek, seçenekleri varsayılan değerlerine ayarlar:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
Ek HTTP.sys yapılandırması kayıt defteri ayarları aracılığıyla işlenir.
HTTP.sys seçenekleri
Özellik | Açıklama | Varsayılan |
---|---|---|
AllowSynchronousIO | ve HttpContext.Response.Body için zaman uyumlu giriş/çıkışa HttpContext.Request.Body izin verilip verilmeyeceğini denetleyin. |
false |
Authentication.AllowAnonymous | Anonim isteklere izin verin. | true |
Authentication.Schemes | İzin verilen kimlik doğrulama düzenlerini belirtin. Dinleyicinin yok edilmesinden önce herhangi bir zamanda değiştirilebilir. Değerler AuthenticationSchemes sabit listesi tarafından sağlanır: Basic , Kerberos , Negotiate , None ve NTLM . |
None |
EnableResponseCaching | Uygun üst bilgiler içeren yanıtlar için çekirdek modu önbelleğe almayı deneme. Yanıt , Vary veya Pragma üst bilgileri içermeyebilirSet-Cookie . bir veya değeri veya üst bilgisi içeren public bir shared-max-age max-age Expires üst bilgi içermelidir.Cache-Control |
true |
Http503Verbosity | Azaltma koşulları nedeniyle istekleri reddederken HTTP.sys davranışı. | Http503VerbosityLevel. Temel |
MaxAccepts | En fazla eşzamanlı kabul sayısı. | 5 × Ortamı. ProcessorCount |
MaxConnections | Kabul etmek için en fazla eşzamanlı bağlantı sayısı. Sonsuz için kullanın -1 . Kayıt defterinin makine genelindeki ayarını kullanmak için kullanın null . |
null (makine genelinde ayarı) |
MaxRequestBodySize | MaxRequestBodySize bölümüne bakın. | 30000000 bayt (~28,6 MB) |
RequestQueueLimit | Kuyruğa alınabilecek en fazla istek sayısı. | 1000 |
RequestQueueMode |
Bu, sunucunun istek kuyruğu oluşturma ve yapılandırmadan sorumlu olup olmadığını veya mevcut kuyruğa eklenip eklenmeyeceğini gösterir. Mevcut yapılandırma seçeneklerinin çoğu mevcut kuyruğa eklenirken uygulanmaz. |
RequestQueueMode.Create |
RequestQueueName |
HTTP.sys istek kuyruğunun adı. | null (Anonim kuyruk) |
ThrowWriteExceptions | İstemci bağlantısı kesildiğinden başarısız olan yanıt gövdesi yazma işleminin özel durumlar oluşturarak veya normal şekilde tamamlanmasını sağlayın. | false (normal şekilde tamamla) |
Timeouts | Kayıt defterinde de yapılandırılabilir olan HTTP.sys TimeoutManager yapılandırmasını kullanıma sunma. Varsayılan değerler de dahil olmak üzere her ayar hakkında daha fazla bilgi edinmek için API bağlantılarını izleyin:
|
|
UrlPrefixes | UrlPrefixCollection HTTP.sys ile kaydedilecek öğesini belirtin. En kullanışlı olan , UrlPrefixCollection.Addkoleksiyona bir ön ek eklemek için kullanılır. Bunlar dinleyicinin yok edilmesinden önce herhangi bir zamanda değiştirilebilir. |
MaxRequestBodySize
Bayt cinsinden herhangi bir istek gövdesinin izin verilen en büyük boyutu. olarak null
ayarlandığında, istek gövdesi boyutu üst sınırı sınırsızdır. Bu sınırın, her zaman sınırsız olan yükseltilmiş bağlantılar üzerinde hiçbir etkisi yoktur.
Tek bir ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için IActionResult
önerilen yöntem, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Uygulama isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa bir özel durum oluşur. Özelliğin IsReadOnly
MaxRequestBodySize
salt okunur durumda olup olmadığını belirtmek için bir özellik kullanılabilir; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.
Uygulamanın istek başına geçersiz kılması MaxRequestBodySize gerekiyorsa kullanın IHttpMaxRequestBodySizeFeature:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Visual Studio kullanıyorsanız, uygulamanın IIS veya IIS Express'i çalıştıracak şekilde yapılandırılmadığından emin olun.
Visual Studio'da varsayılan başlatma profili IIS Express içindir. Projeyi konsol uygulaması olarak çalıştırmak için, aşağıdaki ekran görüntüsünde gösterildiği gibi seçili profili el ile değiştirin:
Windows Server'ı yapılandırma
Uygulama için açılacak bağlantı noktalarını belirleyin ve trafiğin HTTP.sys ulaşmasına izin vermek üzere güvenlik duvarı bağlantı noktalarını açmak için Windows Güvenlik Duvarı veya New-NetFirewallRule PowerShell cmdlet'ini kullanın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.
Azure VM'sine dağıtım yaparken Ağ Güvenlik Grubu'ndaki bağlantı noktalarını açın. Aşağıdaki komutlarda ve uygulama yapılandırmasında 443 numaralı bağlantı noktası kullanılır.
Gerekirse X.509 sertifikalarını alın ve yükleyin.
Windows'da, New-SelfSignedCertificate PowerShell cmdlet'ini kullanarak otomatik olarak imzalanan sertifikalar oluşturun. Desteklenmeyen bir örnek için bkz . UpdateIISExpressSSLForChrome.ps1.
Sunucunun Yerel Makine>Kişisel deposuna otomatik olarak imzalanan veya CA imzalı sertifikalar yükleyin.
Uygulama çerçeveye bağımlı bir dağıtımsa .NET Core, .NET Framework veya her ikisini birden yükleyin (uygulama .NET Framework'ü hedefleyen bir .NET Core uygulamasıysa).
- .NET Core: Uygulama .NET Core gerektiriyorsa .NET Core İndirmeleri'nden .NET Core Çalışma Zamanı yükleyicisini alın ve çalıştırın. Tam SDK'yi sunucuya yüklemeyin.
- .NET Framework: Uygulama .NET Framework gerektiriyorsa , .NET Framework yükleme kılavuzuna bakın. Gerekli .NET Framework'ü yükleyin. En son .NET Framework yükleyicisine .NET Core İndirmeleri sayfasından ulaşabilirsiniz.
Uygulama bağımsız bir dağıtımsa, uygulama çalışma zamanını dağıtımına ekler. Sunucuda çerçeve yüklemesi gerekmez.
Uygulamada URL'leri ve bağlantı noktalarını yapılandırın.
Varsayılan olarak, ASP.NET Core öğesine
http://localhost:5000
bağlanır. URL ön eklerini ve bağlantı noktalarını yapılandırmak için seçenekler şunlardır:- UseUrls
urls
komut satırı bağımsız değişkeniASPNETCORE_URLS
ortam değişkeni- UrlPrefixes
Aşağıdaki kod örneği, 443 numaralı bağlantı noktasında sunucunun yerel IP adresiyle
10.0.0.4
nasıl kullanılacağını UrlPrefixes gösterir:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); webBuilder.UseStartup<Startup>(); });
Bunun bir avantajı
UrlPrefixes
, hatalı biçimlendirilmiş ön ekler için hemen bir hata iletisi oluşturulmasıdır.Geçersiz kılma/
ASPNETCORE_URLS
UseUrls
urls
/ayarlarındakiUrlPrefixes
ayarlar. Bu nedenle , ve ortam değişkenininUseUrls
urls
ASPNETCORE_URLS
avantajlarından biri ve HTTP.sys arasında Kestrel geçiş yapmak daha kolay olmasıdır.HTTP.sys HTTP Sunucu API'si UrlPrefix dize biçimlerini kullanır.
Uyarı
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 konak adları veya IP adresleri kullanın. Alt etki alanı joker karakter bağlaması (örneğin,*.mysub.com
) üst etki alanının tamamını denetlerseniz (*.com
güvenlik açığı olan yerine) bir güvenlik riski değildir. Daha fazla bilgi için bkz . RFC 9110: Bölüm 7.2: Konak ve :authority.Sunucudaki URL ön eklerini önceden kaydedin.
HTTP.sys yapılandırmaya yönelik yerleşik araç netsh.exe. netsh.exe, URL ön eklerini ayırmak ve X.509 sertifikaları atamak için kullanılır. Araç yönetici ayrıcalıkları gerektirir.
Uygulamaya URL'leri kaydetmek için netsh.exe aracını kullanın:
netsh http add urlacl url=<URL> user=<USER>
<URL>
: Tam Tekdüzen Kaynak Bulucu (URL). Joker karakter bağlaması kullanmayın. Geçerli bir ana bilgisayar adı veya yerel IP adresi kullanın. URL sonunda bir eğik çizgi içermelidir.<USER>
: Kullanıcı veya kullanıcı grubu adını belirtir.
Aşağıdaki örnekte, sunucunun yerel IP adresi şöyledir
10.0.0.4
:netsh http add urlacl url=https://10.0.0.4:443/ user=Users
Bir URL kaydedildiğinde, araç ile
URL reservation successfully added
yanıt verir.Kayıtlı URL'yi silmek için komutunu
delete urlacl
kullanı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 Özellikler'i seçerek uygulamanın proje özelliklerini açın.
- Paket sekmesini seçin.
- Etiketler alanına oluşturduğunuz GUID'yi girin.
- Visual Studio'yu kullanmadığınızda:
Uygulamanın proje dosyasını açın.
<PackageTags>
Oluşturduğunuz GUID ile yeni veya var olan<PropertyGroup>
bir özelliğe özellik ekleyin:<PropertyGroup> <PackageTags>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ç ile
SSL Certificate successfully added
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:
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. ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma.
gRPC'yi desteklemek için gelişmiş HTTP/2 özellikleri
HTTP.sys'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ı
Römork
HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Yukarıdaki örnek kodda:
SupportsTrailers
, römorkların yanıt için desteklendiğini güvence altına alır.DeclareTrailer
verilen römork adını yanıt üst bilgisineTrailer
ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsaDeclareTrailer
, yanıt üst bilgileri gönderilmeden önce olmalıdır.AppendTrailer
römorku ekler.
Reset
Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR
. HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.
Ek kaynaklar
ASP.NET Core