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.
Not
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.
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 10 sürümüne bakın.
Ara yazılım, istekleri ve yanıtları işlemek için uygulama işlem hattıyla birleştirilmiş bir yazılımdır. Her ara yazılım:
- İsteğin işlem hattındaki bir sonraki ara yazılıma geçirilip geçirileceğini seçer.
- İşlem hattında sonraki ara yazılımdan önce ve sonra iş gerçekleştirebilir.
İstek işlem hattını oluşturmak için istek temsilcileri kullanılır. İstek temsilcileri her HTTP isteğini işler.
İstek temsilcileri Run, Map ve Use uzantı yöntemleri kullanılarak yapılandırılır. Tek bir istek temsilcisi, anonim bir yöntem (satır içi ara yazılım olarak adlandırılır) olarak satır içinde belirtilebilir veya yeniden kullanılabilir bir sınıfta tanımlanabilir. Bu satır içi anonim yöntemler veya yeniden kullanılabilir sınıflar ara yazılım veya ara yazılım bileşenleri olarak adlandırılır. İstek işlem hattındaki her ara yazılım, işlem hattında sonraki ara yazılımı çağırmak veya işlem hattını kısa devre yaptırmaktan sorumludur. Ara yazılım kısa devre yaptığında sonlandırma ara yazılımı olarak adlandırılır çünkü ara yazılımın isteği daha fazla işlemesini engeller.
ASP.NET Core'daki istek işlem hatları ile ek ara yazılım örnekleriyle ASP.NET 4.x arasındaki fark hakkında daha fazla bilgi için bkz. HTTP modüllerini ASP.NET Core ara yazılımına geçirme.
Ara yazılımların uygulama türüne göre rolü
Sunucu tarafı Blazor, Razor Sayfalar ve MVC, tarayıcı isteklerini ara yazılım aracılığıyla sunucuda işler. Bu makaledeki yönergeler bu tür uygulamalar için geçerlidir.
Tek başına Blazor WebAssembly uygulamalar tamamen istemcide çalışır ve istekleri ara yazılım işlem hattıyla işlemez. Bu makaledeki yönergeler tek başına Blazor WebAssembly uygulamaları için geçerli değildir.
Ara yazılım kod analizi
ASP.NET Core'un uygulama kodunu kalite açısından inceleyen derleyici platformu çözümleyicileri hakkında daha fazla bilgi için bkz. ASP.NET Core Apps'te Tanılama Kodu Analizi.
WebApplication ile ara yazılım işlem hattı oluşturma
ASP.NET Core istek işlem hattı birbiri ardına çağrılan bir dizi istek temsilcisinden oluşur. Aşağıdaki diyagramda bu kavram gösterilir. Yürütme akışı siyah okları izler.
Her temsilci, sonraki temsilciden önce ve sonra işlemler gerçekleştirebilir. Özel durum işleme temsilcileri işlem hattının başlarında çağrılmalıdır; böylece işlem hattının ileri aşamalarında oluşan özel durumları yakalayabilirler.
Not
Bu bölümdeki kod örnekleriyle yerel olarak denemeler yapmak için ASP.NET Core Boş proje şablonunu kullanarak bir ASP.NET Core uygulaması oluşturun. .NET CLI kullanılıyorsa, şablonun kısa adı (web) olur dotnet new web .
En basit ASP.NET Core uygulaması, tek bir terminal ara yazılımını istek işlem hattı olmadan istekleri işlemek üzere anonim işlev isteği temsilcisi olarak ayarlamak için çağırır Run .
Aşağıdaki örnekte:
- RunExtensions.Run çağrısı her istekte çağrılır ve yanıt olarak "Hello world!" yazar.
- Kod bloğunun sonundaki WebApplication.Run çağrısı uygulamayı çalıştırır ve sunucu kapanana kadar çağrı yapan iş parçacığını engeller.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
Uygulamaya bir tarayıcıda başlatma URL'sinde erişirken yanıt:
Hello world!
Use ile birden çok istek temsilcisini zincirleme bağlayın.
next parametresi işlem hattında yer alan sonraki temsilciyi temsil eder. Normalde next delege öncesinde ve sonrasında eylemler gerçekleştirebilirsiniz.
Aşağıdaki örnekte gösterilmiştir:
- Konsola yazan iki Use çağrı:
- Yanıta (
context.Response, HttpResponse) yazabilen çalışmaların gerçekleştirilebileceği yer. - Burada, parametre çağrıldıktan sonra yanıta yazmayan
nextçalışmalar gerçekleştirilebilir.
- Yanıta (
- Yanıtına "RunExtensions.Run" yazan, Hello world! çağrısını içeren bir terminal isteği temsilcisi.
- Terminal isteği temsilcisini izlediği için hiçbir zaman yürütülmeyecek bir Use son Run çağrı.
- Kod bloğunun sonundaki WebApplication.Run çağrısı, uygulamayı çalıştırmak ve ana bilgisayar kapanana kadar çağıran iş parçacığını engellemek içindir.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
Console.WriteLine("Work that can write to the response. (1)");
await next.Invoke(context);
Console.WriteLine("Work that doesn't write to the response. (1)");
});
app.Use(async (context, next) =>
{
Console.WriteLine("Work that can write to the response. (2)");
await next.Invoke(context);
Console.WriteLine("Work that doesn't write to the response. (2)");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Use(async (context, next) =>
{
Console.WriteLine("This statement isn't reached. (3)");
await next.Invoke(context);
Console.WriteLine("This statement isn't reached. (3)");
});
app.Run();
Uygulama çalıştırıldığında uygulamanın konsol penceresinde:
Yanıt olarak yazabilen iş (1)
Yanıt olarak yazabilen iş (2)
Yanıta yazmayan çalışma. (2)
Yanıta yazmayan çalışma. (1)
gereksiz çalışmayı önlediğinden istek işlem hattının kısa devresi genellikle tercih edilir. Örneğin Statik Dosya Ara Yazılımı, statik bir dosya için bir istek işleyip işlem hattının geri kalanını kısa devre yaparak terminal ara yazılımı gibi davranabilir. Terminal ara yazılımlarından önce işlem hattına eklenen ara yazılım, next.Invoke ifadelerinden sonra da kod işlemeye devam eder. Amacınız işlem hattını sonlandırmaksa ve next.Invoke çağırmayı planlamıyorsanız, uzantı yöntemini çağırmak yerine bir Run temsilci kullanın.
Yanıt istemciye gönderilirken veya gönderildikten sonra aramayın next.Invoke .
HttpResponse başlatıldıktan sonra yapılan değişiklikler özel durumla sonuçlanır. Örneğin, üst bilgileri veya yanıt durum kodunu ayarlamak, yanıt başladıktan sonra bir hata oluşturur.
next çağrısından sonra yanıt gövdesine yazmak şunlara neden olabilir:
- Belirtilen yanıtın içerik uzunluğundan
Content-Length(üst bilgi değeri) daha fazla bayt yazma gibi bir protokol ihlaline neden olur. - CSS dosyasına HTML alt bilgisi yazma gibi gövde biçimini bozar.
Yanıtın başlatılıp başlatılmadığını belirlemek için HasStarted değerini denetleyin.
Daha fazla bilgi için bkz. Kısa devre ara yazılımı, yönlendirmeden sonra.
Run Temsilci
Bir Run delege next parametresi almaz. İlk Run temsilci her zaman işlem hattını sonlandırır.
Run ayrıca bir konvansiyondur ve bazı ara yazılımlar işlem hattının sonunda yürütülen Run yöntemlerini kullanıma sunabilir.
İlk Use temsilciden sonraki hiçbir Run temsilci veya Run temsilci çağrılmaz.
Ara yazılım işlem hattını dallandırma
Map uzantılar, istek işleme işlem hattını dallara ayırmak için bir kural olarak kullanılır. Map, verilen istek yolunun eşleşmeleri temelinde istek işlem hattının dallanmasını sağlar. İstek yolu verilen yolla başlıyorsa, dal yürütülür.
Aşağıdaki örnekte, HandleMap1/map1'ye yapılan istekler için çağrılır ve HandleMap2/map2'ye yapılan istekler için çağrılır.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1", HandleMap1);
app.Map("/map2", HandleMap2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate!");
});
app.Run();
private static void HandleMap1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map 1");
});
}
private static void HandleMap2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map 2");
});
}
Aşağıdaki tabloda, önceki kodu kullanan istekler ve yanıtlar gösterilmektedir.
| İstek | Yanıt |
|---|---|
/ |
Hello from the non-Map delegate. |
/map1 |
Map 1 |
/map2 |
Map 2 |
/map3 |
Hello from the non-Map delegate. |
Map kullanıldığında, eşleşen yol segmentleri HttpRequest.Path özelliğinden kaldırılır ve her istek için HttpRequest.PathBase özelliğinin sonuna eklenir.
Map aynı anda birden çok segmenti eşleştirebilir:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1/segment1", HandleMultipleSegments);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate.");
});
app.Run();
private static void HandleMultipleSegments(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Processing '/map1/segment1'");
});
}
Aşağıdaki tabloda, önceki kodu kullanan istekler ve yanıtlar gösterilmektedir.
| İstek | Yanıt |
|---|---|
/ |
Hello from the non-Map delegate. |
/map1/segment1 |
Processing '/map1/segment1' |
Map iç içe yerleştirmeyi destekler:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
level2AApp.Run(async context =>
{
await context.Response.WriteAsync("Processing '/level1/level2a'");
});
});
level1App.Map("/level2b", level2BApp => {
level2BApp.Run(async context =>
{
await context.Response.WriteAsync("Processing '/level1/level2b'");
});
});
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate!");
});
app.Run();
Aşağıdaki tabloda, önceki kodu kullanan istekler ve yanıtlar gösterilmektedir.
| İstek | Yanıt |
|---|---|
/ |
Hello from the non-Map delegate. |
/level1/level2a |
Processing '/level1/level2a' |
/level1/level2b |
Processing '/level1/level2b' |
MapWhen, istek işlem hattını verilen koşulun sonucuna dayanarak dallandırır. İstekleri işlem hattının yeni bir dalına eşlemek için Func<HttpContext, bool> türündeki tüm koşullar kullanılabilir. Aşağıdaki örnekte, "branch" adlı bir sorgu dizesi değişkeninin varlığını algılamak için bir koşul kullanılır:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapWhen(context => context.Request.Query.ContainsKey("branch"), HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate.");
});
app.Run();
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = '{branchVer}'");
});
}
Aşağıdaki tabloda, önceki kodu kullanan istekler ve yanıtlar gösterilmektedir.
| İstek | Yanıt |
|---|---|
/ |
Hello from the non-Map delegate. |
/?branch=main |
Branch used = 'main' |
UseWhen belirtilen koşulun sonucuna göre istek işlem hattını dallandırabilir. MapWhen'den farklı olarak, terminal ara yazılımı içermiyorsa dal ana işlem hattına yeniden katılır.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate.");
});
app.Run();
void HandleBranchAndRejoin(IApplicationBuilder app)
{
var logger = app.ApplicationServices.GetRequiredService<ILogger<Program>>();
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer.ToString());
Console.WriteLine("Work that can write to the response.");
await next.Invoke(context);
Console.WriteLine("Work that doesn't write to the response.");
});
}
Yukarıdaki örnekte, tüm istekler için "Hello from the non-Map delegate." yanıtı yazılmıştır. İstek "branch" adlı bir sorgu dizesi değişkeni içeriyorsa, ana işlem hattına tekrar eklenmeden önce değeri günlüğe kaydedilir.
IApplicationBuilder ile ara yazılım işlem hattı oluşturma
ASP.NET Core istek işlem hattı birbiri ardına çağrılan bir dizi istek temsilcisinden oluşur. Aşağıdaki diyagramda bu kavram gösterilir. Yürütme akışı siyah okları izler.
Her temsilci, sonraki temsilciden önce ve sonra işlemler gerçekleştirebilir. Özel durum işleme temsilcileri işlem hattının başlarında çağrılmalıdır; böylece işlem hattının ileri aşamalarında oluşan özel durumları yakalayabilirler.
Mümkün olan en basit ASP.NET Core uygulaması tüm istekleri işleyen tek bir istek temsilcisi ayarlar. Bu örnek gerçek bir istek işlem hattı içermez. Bunun yerine her HTTP isteğine yanıt olarak tek bir anonim işlev çağrılır.
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Hello, World!");
});
}
}
Use ile birden çok istek temsilcisini zincirleme bağlayın.
next parametresi işlem hattında yer alan sonraki temsilciyi temsil eder.
next parametresini çağırmayarak işlem hattının kısa devre yapmasını sağlayabilirsiniz. Normalde, aşağıdaki örnek bunu göstermektedir: sonraki delegenin hem öncesinde hem de sonrasında eylemler gerçekleştirebilirsiniz.
app.Use(async (context, next) =>
{
// Do work that doesn't write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
Temsilci bir isteği sonraki temsilciye geçirmediğinde, bu durum istek işlem hattının kısa devre yapması olarak adlandırılır. Kısa devre genellikle istenen bir durumdur çünkü gereksiz çalışmayı önler. Örneğin Statik Dosya Ara Yazılımı, statik bir dosya için bir istek işleyip işlem hattının geri kalanını kısa devre yaparak terminal ara yazılımı gibi davranabilir. Daha fazla işlemeyi sonlandıran ara yazılımdan önce işlem hattına eklenen ara yazılım, next.Invoke ifadelerinden sonra da kod çalıştırmaya devam eder. Bununla birlikte, zaten gönderilmiş olan bir yanıta yazmaya çalışılmasına ilişkin aşağıdaki uyarıya dikkat edin.
Uyarı
Yanıt istemciye gönderildikten sonra next.Invoke çağrısı yapmayın. Yanıt başlatıldıktan sonra yapılan HttpResponse değişiklikleri bir istisna fırlatır. Örneğin, üst bilgileri ve durum kodunu ayarlamak bir istisna fırlatır.
next çağrısından sonra yanıt gövdesine veri yazmak:
- Protokol ihlaline neden olabilir. Örneğin belirtilen
Content-Lengthdeğerinden daha fazla yazma. - Gövde biçimini bozabilir. Örneğin CSS dosyasına bir HTML alt bilgisi yazma.
HasStarted, üst bilgilerin gönderilip gönderilmediğini veya gövdeye yazılıp yazılmadığını gösteren yararlı bir ipucudur.
Run temsilcileri next parametresini almazlar. İlk Run temsilcisi her zaman sonlandırıcıdır ve işlem hattını sonlandırır.
Run bir kuraldır. Bazı ara yazılım bileşenleri, işlem hattının sonunda çalıştırılan Run[Middleware] yöntemlerini kullanıma sunabilir:
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
Yukarıdaki örnekte Run temsilcisi yanıta "Hello from 2nd delegate." yazar ve ardından işlem hattını sonlandırır.
Use temsilcisinden sonra başka bir Run veya Run temsilcisi eklendiyse, bu eklenen temsilci çağrılmaz.
Ara yazılım işlem hattını dallandırma
Map uzantıları, işlem hattının dallanmasında kural olarak kullanılır.
Map, verilen istek yolunun eşleşmeleri temelinde istek işlem hattının dallanmasını sağlar. İstek yolu verilen yolla başlıyorsa, dal yürütülür.
public class Startup
{
private static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
private static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 2");
});
}
public void Configure(IApplicationBuilder app)
{
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
Aşağıdaki tabloda, yukarıdaki kod kullanıldığında http://localhost:1234 konumundan gelen istekler ve yanıtlar gösterilir.
| İstek | Yanıt |
|---|---|
| localhost:1234 | Merhaba, Map olmayan delege. |
| localhost:1234/map1 | Harita Testi 1 |
| localhost:1234/map2 | Eşleme Testi 2 |
| localhost:1234/map3 | Merhaba, Map olmayan delege. |
Map kullanıldığında, eşleşen yol segmentleri HttpRequest.Path özelliğinden kaldırılır ve her istek için HttpRequest.PathBase özelliğinin sonuna eklenir.
Map iç içe yerleştirmeyi destekler. Örneğin:
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a" processing
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b" processing
});
});
Ayrıca Map birden çok segmenti bir kerede eşleştirebilir:
public class Startup
{
private static void HandleMultiSeg(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map multiple segments.");
});
}
public void Configure(IApplicationBuilder app)
{
app.Map("/map1/seg1", HandleMultiSeg);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
MapWhen, istek işlem hattını verilen koşulun sonucuna dayanarak dallandırır. İstekleri işlem hattının yeni bir dalına eşlemek için Func<HttpContext, bool> türündeki tüm koşullar kullanılabilir. Aşağıdaki örnekte branch sorgu dizesi değişkeninin varlığını algılamak için bir koşul kullanılır:
public class Startup
{
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = {branchVer}");
});
}
public void Configure(IApplicationBuilder app)
{
app.MapWhen(context => context.Request.Query.ContainsKey("branch"),
HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
Aşağıdaki tabloda, yukarıdaki kod kullanıldığında http://localhost:1234 konumundan gelen istekler ve yanıtlar gösterilir:
| İstek | Yanıt |
|---|---|
| localhost:1234 | Merhaba, Map olmayan delege. |
| localhost:1234/?branch=main | Kullanılan dal = ana |
UseWhen de istek işlem hattını verilen koşulun sonucuna dayanarak dallandırır.
MapWhen özelliğinden farklı olarak, kısa devre yapmazsa veya sonlandırma ara yazılımı içermiyorsa bu dal ana işlem hattına yeniden katılır:
public class Startup
{
private void HandleBranchAndRejoin(IApplicationBuilder app, ILogger<Startup> logger)
{
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer.ToString());
// Do work that doesn't write to the Response.
await next();
// Do other work that doesn't write to the Response.
});
}
public void Configure(IApplicationBuilder app, ILogger<Startup> logger)
{
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder, logger));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from main pipeline.");
});
}
}
Yukarıdaki örnekte tüm istekler için "Ana hattından merhaba." yanıtı verilir. İstek bir branch sorgu dizesi değişkeni içeriyorsa, ana işlem hattına yeniden katılmadan önce değeri kaydedilecektir.
Ara yazılım sıralaması
Ara yazılımların uygulamanın Program dosyasında görünme sırası, yanıt için ters sırada bir istekte ara yazılımların çağrılma sırasını tanımlar.
Ara yazılım sırasının güvenlik, performans ve işlevsellik açısından kritik olabileceğini göz önünde bulundurarak ara yazılımların sırası ve istek işleme senaryoları için özel ara yazılım ekleme özelliği üzerinde tam denetime sahipsiniz.
Aşağıdaki örneklerde, yaygın uygulama senaryoları için ara yazılım sırası gösterilmektedir. Her bir middleware genişletme yöntemi, WebApplicationBuilder ad alanı üzerinden Microsoft.AspNetCore.Builder'e sunulur:
- Özel durum/hata işleme
- Uygulama
Developmentortamında çalıştığında:- Geliştirici Özel Durum Sayfası Ara Yazılımı (UseDeveloperExceptionPage) uygulama çalışma zamanı hatalarını bildirir.
- Veritabanı Hata Sayfası Ara Yazılımı (UseDatabaseErrorPage) veritabanı çalışma zamanı hatalarını bildirir.
- Uygulama
Productionortamında çalıştığında:- Özel Durum İşleyici Ara Yazılımı (UseExceptionHandler), aşağıdaki ara yazılımlarda oluşan özel durumları yakalar.
- HTTP Katı Aktarım Güvenliği Protokolü (HSTS) Ara Yazılımı (UseHsts)
Strict-Transport-Securityüst bilgisini ekler.
- Uygulama
- HTTPS Yeniden Yönlendirme Ara Yazılımı (UseHttpsRedirection) HTTP isteklerini HTTPS'ye yeniden yönlendirir.
- Statik Dosya Ara Yazılımı (gerekirse UseStaticFiles), statik dosyaları döndürür ve diğer istek işlemlerini durdurur.
- Cookie İlke Ara Yazılımı (UseCookiePolicy), uygulamayı AB Genel Veri Koruma Yönetmeliği'ne (GDPR) uygun kılar.
- Yönlendirme Ara Yazılımı (UseRouting) istekleri yönlendirir.
- Kimlik Doğrulaması Ara Yazılımı (UseAuthentication), kullanıcının güvenli kaynaklara erişmesine izin verilmeden önce kimliğini doğrulamaya çalışır.
- Yetkilendirme Ara Yazılımı (UseAuthorization), kullanıcıyı güvenli kaynaklara erişmesi için yetkilendirir.
- Antiforgery Ara Yazılımı (UseAntiforgery) işlem hattına eklenir ve UseAntiforgery ile UseAuthentication çağrılarından sonra yerleştirilmelidir.
- Oturum Ara Yazılımı (Razor Yalnızca Sayfalar ve MVC için), UseSessionoturum durumunu oluşturur ve korur. Uygulama oturum durumu kullanıyorsa, İlke Ara Yazılımı'nın ardından Cookie ve Pages/MVC Ara Yazılımından önce Razor Oturum Ara Yazılımı'nı çağırın.
- Uç Nokta Yönlendirme Ara Yazılımı
- MapRazorComponents bileşen uç noktalarını istek işlem hattına eklemek Razor için.
- MapRazorPages sayfa uç noktalarını istek işlem hattına eklemek Razor için.
- MapControllerRoute denetleyici uç noktalarını istek işlem hattına eklemek için.
Tipik Blazor Web App ara yazılım işlem hattı:
app.UseWebAssemblyDebugging(); // Development environment with client-side rendering
app.UseMigrationsEndPoint(); // Development environment with ASP.NET Core Identity
app.UseExceptionHandler("/Error", createScopeForErrors: true); // Non-Development environment
app.UseHsts(); // Non-Development environment with HTTPS protocol
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseHttpsRedirection(); // With HTTPS protocol
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>(); // With additional extension methods for render modes
app.MapAdditionalIdentityEndpoints(); // With ASP.NET Core Identity
app.Run();
Tipik Razor Sayfalar/MVC ara yazılım işlem hattı:
app.UseMigrationsEndPoint(); // Development environment with ASP.NET Core Identity
app.UseExceptionHandler("/Error"); // Non-Development environment
app.UseHsts(); // Non-Development environment with HTTPS protocol
app.UseHttpsRedirection(); // With HTTPS protocol
// app.UseCookiePolicy();
app.UseRouting(); // If not called, runs at the beginning of the pipeline by default
// app.UseRateLimiter();
// app.UseRequestLocalization();
// app.UseCors();
// app.UseAuthentication(); // Called internally for ASP.NET Core Identity
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapStaticAssets();
app.MapControllerRoute(...); // For MVC controllers
app.MapRazorPages(); // For Razor Pages pages
app.MapControllers(); // With authentication in a Razor Pages app
app.Run();
Önceki kodda:
- CORS Ara Yazılımı (UseCors), Kimlik Doğrulama Ara Yazılımı (UseAuthentication) ve Yetkilendirme Ara Yazılımı (UseAuthorization) gösterilen sırada görünmelidir.
- CORS Ara Yazılımı (UseCors), önbelleğe alınmış yanıtlar da dahil olmak üzere her istekte CORS üst bilgileri eklemek için Yanıt Önbelleğe Alma Ara Yazılımından (UseResponseCaching) önce görünmelidir. Daha fazla bilgi için bkz. UseCORS'un UseResponseCaching (
dotnet/aspnetcore#23218) öncesinde gelmesi gerektiği açık değildir. - İstek Yerelleştirme Ara Yazılımı (UseRequestLocalization), istek kültürünü denetleyebilen herhangi bir ara yazılımdan önce görünmelidir, örneğin, Statik Dosya Ara Yazılımı (UseStaticFiles ).
- Uç noktaya özgü hız sınırlama API'leri kullanıldığında, Hız Sınırlama Ara Yazılımı (UseRateLimiter) Yönlendirme Ara Yazılımı (UseRouting) sonrasında çağrılmalıdır. Örneğin, öznitelik kullanılıyorsa
[EnableRateLimiting], Yönlendirme Ara Yazılımı'nın ardından Hız Sınırlama Ara Yazılımı çağrılmalıdır. Yalnızca genel sınırlayıcılar çağrılırken, Hız Sınırlama Ara Yazılımı Yönlendirme Ara Yazılımından önce çağrılabilir.
Bazı senaryolarda ara yazılımların farklı sıralamaları vardır. Örneğin, önbelleğe alma ve sıkıştırma sıralaması uygulamanın belirtimine bağlıdır. Aşağıdaki sırayla, sıkıştırılmış yanıt önbelleğe alınarak CPU kullanımı azaltılabilir, ancak uygulama Gzip veya Brotli gibi farklı sıkıştırma algoritmaları kullanarak bir kaynağın birden çok gösterimini önbelleğe alabilir:
app.UseResponseCaching();
app.UseResponseCompression();
Statik dosyalar genellikle işlem hattının başında sunulur, böylece uygulama performansı artırmak için istek işlemeyi hızlandırabilir.
Kimlik Doğrulaması, kimliği doğrulamamış istekleri kesmez. Kimlik Doğrulama Ara Yazılımı isteklerin kimliğini doğrulasa da, yetkilendirme, çerçeve bir Razor bileşenini Blazor Web App seçtikten sonra, bir Sayfalar uygulamasında bir Razor sayfayı veya bir MVC uygulamasında bir denetleyici ve bir eylemi seçtikten sonra gerçekleşir.
Aşağıdaki diyagramda ASP.NET Core MVC ve Razor Pages uygulamaları için eksiksiz bir istek işleme işlem hattı gösterilir. Tipik bir uygulamada mevcut ara yazılımların nasıl sıralandığını ve özel ara yazılımların nereye eklendiğini görebilirsiniz. Senaryolarınız için mevcut ara yazılımların yeniden sıralanması veya yeni özel ara yazılımlar eklenmesi konusunda tam denetim sahibisiniz.
Yukarıdaki diyagramda Uç Nokta (Endpoint) ara yazılımı, ilgili uygulama türü (MVC veya Razor Pages) için filtre işlem hattını yürütür.
Yukarıdaki diyagramda yer alan Yönlendirme (Routing) ara yazılımı Statik Dosyalar (Static Files) ara yazılımından sonra gösterilir. Bu, proje şablonlarının açıkça app.UseRouting yöntemini çağırarak gerçekleştirdikleri sıradır.
app.UseRouting yöntemini çağırmazsanız Routing ara yazılımı varsayılan olarak işlem hattının başlangıcında çalıştırılır. Daha fazla bilgi için bkz. Yönlendirme.
Ara yazılım bileşenlerinin Program.cs dosyasına eklenme sırası, isteklerde ara yazılım bileşenlerinin çağrılma sırasını ve yanıt için de ters sırayı tanımlar. Güvenlik, performans ve işlevsellik açısından bu sıralama kritik önem taşır.
Aşağıdaki Program.cs dosyasında vurgulanmış kod, güvenlikle ilgili ara yazılım bileşenlerini normalde önerilen sırayla ekler:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMiddleware.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRateLimiter();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapRazorPages();
app.MapDefaultControllerRoute();
app.Run();
Önceki kodda:
- Tek tek kullanıcı hesaplarıyla yeni web uygulaması oluşturulurken eklenmeyen ara yazılımlar açıklama satırı yapılır.
- Ara yazılımların hepsi tam olarak bu sırada görünmez ama birçoğu bu sıraya uyar. Örneğin:
-
UseCors,UseAuthenticationveUseAuthorizationgösterilen sırada görünmelidir. -
UseCorsşu andaUseResponseCaching'den önce görünmelidir. Bu gereksinim GitHub konusu dotnet/aspnetcore #23218'de açıklanmıştır. -
UseRequestLocalization, istek kültürünü denetleyebilen herhangi bir ara yazılımdan önce görünmelidir, örneğin,app.UseStaticFiles(). -
UseRateLimiter hız sınırlama uç noktasına özgü API'ler kullanıldıktan sonra
UseRoutingçağrılmalıdır. Örneğin, eğer[EnableRateLimiting]özniteliği kullanılıyorsa,UseRateLimiterözniteliğiUseRouting'den sonra çağrılmalıdır. Yalnızca genel sınırlayıcılar çağrılırken,UseRateLimiteröncesindeUseRoutingçağrılabilir.
-
Bazı senaryolarda ara yazılımların farklı sıralamaları vardır. Örneğin önbelleğe alma ve sıkıştırma sıralaması senaryoya özgüdür ve birden çok geçerli sıralama vardır. Örneğin:
app.UseResponseCaching();
app.UseResponseCompression();
Yukarıdaki kodla, sıkıştırılan yanıt önbelleğe alınarak CPU kullanımı azaltılabilir ama sonuçta Gzip veya Brotli gibi farklı sıkıştırma algoritmalarını kullanarak bir kaynağın birden fazla gösterimini önbelleğe alabilirsiniz.
Aşağıdaki sıralama statik dosyaları birleştirerek sıkıştırılmış statik dosyaların önbelleğe alınmasını sağlar:
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Aşağıdaki Program.cs kodu, yaygın uygulama senaryoları için ara yazılım bileşenlerini ekler:
- Özel durum/hata işleme
- Uygulama
Developmentortamında çalıştığında:- Geliştirici Özel Durum Sayfası Ara Yazılımı (UseDeveloperExceptionPage) uygulama çalışma zamanı hatalarını bildirir.
- Veritabanı Hata Sayfası Ara Yazılımı (UseDatabaseErrorPage) veritabanı çalışma zamanı hatalarını bildirir.
- Uygulama
Productionortamında çalıştığında:- Özel Durum İşleyici Ara Yazılımı (UseExceptionHandler), aşağıdaki ara yazılımlarda oluşan özel durumları yakalar.
- HTTP Katı Aktarım Güvenliği Protokolü (HSTS) Ara Yazılımı (UseHsts)
Strict-Transport-Securityüst bilgisini ekler.
- Uygulama
- HTTPS Yeniden Yönlendirme Ara Yazılımı (UseHttpsRedirection) HTTP isteklerini HTTPS'ye yeniden yönlendirir.
- Statik Dosya Ara Katmanı (UseStaticFiles), statik dosyaları döndürür ve daha fazla istek işlenmesini engeller.
- Cookie İlke Ara Yazılımı (UseCookiePolicy), uygulamanın AB Genel Veri Koruma Yönetmeliği'ne (GDPR) uymasını sağlar.
- Yönlendirme Ara Yazılımı (UseRouting) istekleri yönlendirir.
- Kimlik Doğrulaması Ara Yazılımı (UseAuthentication), kullanıcının güvenli kaynaklara erişmesine izin verilmeden önce kimliğini doğrulamaya çalışır.
- Yetkilendirme Ara Yazılımı (UseAuthorization), kullanıcıyı güvenli kaynaklara erişmesi için yetkilendirir.
- Oturum Ara Yazılımı (UseSession) oturum durumunu oluşturur ve korur. Uygulama oturum durumunu kullanıyorsa Oturum Ara Yazılımını Cookie İlke Ara Yazılımından sonra ve MVC Ara Yazılımından önçe çağırın.
- Uç Nokta Yönlendirme Ara Yazılımı (UseEndpoints ile MapRazorPages), istek işlem hattında Razor Pages uç noktaları ekler.
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
Yukarıdaki kod örneğinde WebApplicationBuilder sınıfında her ara yazılım uzantı yöntemi Microsoft.AspNetCore.Builder ad alanı aracılığıyla kullanıma sunulur.
UseExceptionHandler, işlem hattına eklenen ilk ara yazılım bileşenidir. Bu nedenle Özel Durum İşleyicisi Ara Yazılımı sonraki çağrılarda gerçekleşen tüm özel durumları yakalar.
Statik Dosya Ara Yazılımı işlem hattının başlarında çağrılır ve böylece istekleri işleyebilir ve kalan bileşenlere gitmeden kısa devre yapabilir. Statik Dosya Ara Yazılımı yetkilendirme denetimi sağlamaz. Statik Dosya Ara Yazılımı tarafından sunulan tüm dosyalar (wwwroot altındakiler de dahil) genel kullanıma açıktır. Statik dosyaların güvenliğini sağlamaya yönelik bir yaklaşım için bkz. ASP.NET Core'da statik dosyalar.
İstek Statik Dosya Ara Yazılımı tarafından işlenmezse, kimlik doğrulamasını gerçekleştiren Kimlik Doğrulaması Ara Yazılımına (UseAuthentication) geçirilir. Kimlik Doğrulaması, kimliği doğrulamamış istekleri kesmez. Kimlik Doğrulaması Ara Yazılımı isteklerin kimliğini doğrulasa da, yetkilendirme (ve reddetme) ancak MVC belirli bir Razor Sayfası veya MVC denetleyicisi ve eylem seçtikten sonra gerçekleşir.
Aşağıdaki örnek, statik dosyalara yönelik isteklerin Statik Dosya Ara Yazılımı tarafından, Yanıt Sıkıştırma Ara Yazılımından önce işlendiği bir ara yazılım sıralamasını gösterir. Bu ara yazılım sıralamasında statik dosyalar sıkıştırılamaz. Razor Pages yanıtları sıkıştırılabilir.
// Static files aren't compressed by Static File Middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.MapRazorPages();
Aşağıdaki diyagramda ASP.NET Core MVC ve Razor Pages uygulamaları için eksiksiz bir istek işleme işlem hattı gösterilir. Tipik bir uygulamada mevcut ara yazılımların nasıl sıralandığını ve özel ara yazılımların nereye eklendiğini görebilirsiniz. Senaryolarınız için mevcut ara yazılımların yeniden sıralanması veya yeni özel ara yazılımlar eklenmesi konusunda tam denetim sahibisiniz.
Yukarıdaki diyagramda Uç Nokta (Endpoint) ara yazılımı, ilgili uygulama türü (MVC veya Razor Pages) için filtre işlem hattını yürütür.
Yukarıdaki diyagramda yer alan Yönlendirme (Routing) ara yazılımı Statik Dosyalar (Static Files) ara yazılımından sonra gösterilir. Bu, proje şablonlarının açıkça app.UseRouting yöntemini çağırarak gerçekleştirdikleri sıradır.
app.UseRouting yöntemini çağırmazsanız Routing ara yazılımı varsayılan olarak işlem hattının başlangıcında çalıştırılır. Daha fazla bilgi için bkz. Yönlendirme.
Ara yazılım bileşenlerinin Program.cs dosyasına eklenme sırası, isteklerde ara yazılım bileşenlerinin çağrılma sırasını ve yanıt için de ters sırayı tanımlar. Güvenlik, performans ve işlevsellik açısından bu sıralama kritik önem taşır.
Aşağıdaki Program.cs dosyasında vurgulanmış kod, güvenlikle ilgili ara yazılım bileşenlerini normalde önerilen sırayla ekler:
using IndividualAccountsExample.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapRazorPages();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Önceki kodda:
- Tek tek kullanıcı hesaplarıyla yeni web uygulaması oluşturulurken eklenmeyen ara yazılımlar açıklama satırı yapılır.
- Ara yazılımların hepsi tam olarak bu sırada görünmez ama birçoğu bu sıraya uyar. Örneğin:
-
UseCors,UseAuthenticationveUseAuthorizationgösterilen sırada görünmelidir. -
UseCorsşu andaUseResponseCaching'den önce görünmelidir. Bu gereksinim GitHub konusu dotnet/aspnetcore #23218'de açıklanmıştır. -
UseRequestLocalization, istek kültürünü denetleyebilen her ara yazılımdan (örneğinapp.UseMvcWithDefaultRoute()) önce görünmelidir.
-
Bazı senaryolarda ara yazılımların farklı sıralamaları vardır. Örneğin önbelleğe alma ve sıkıştırma sıralaması senaryoya özgüdür ve birden çok geçerli sıralama vardır. Örneğin:
app.UseResponseCaching();
app.UseResponseCompression();
Yukarıdaki kodla, sıkıştırılan yanıt önbelleğe alınarak CPU kullanımı azaltılabilir ama sonuçta Gzip veya Brotli gibi farklı sıkıştırma algoritmalarını kullanarak bir kaynağın birden fazla gösterimini önbelleğe alabilirsiniz.
Aşağıdaki sıralama statik dosyaları birleştirerek sıkıştırılmış statik dosyaların önbelleğe alınmasını sağlar:
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Aşağıdaki Program.cs kodu, yaygın uygulama senaryoları için ara yazılım bileşenlerini ekler:
- Özel durum/hata işleme
- Uygulama
Developmentortamında çalıştığında:- Geliştirici Özel Durum Sayfası Ara Yazılımı (UseDeveloperExceptionPage) uygulama çalışma zamanı hatalarını bildirir.
- Veritabanı Hata Sayfası Ara Yazılımı (UseDatabaseErrorPage) veritabanı çalışma zamanı hatalarını bildirir.
- Uygulama
Productionortamında çalıştığında:- Özel Durum İşleyici Ara Yazılımı (UseExceptionHandler), aşağıdaki ara yazılımlarda oluşan özel durumları yakalar.
- HTTP Katı Aktarım Güvenliği Protokolü (HSTS) Ara Yazılımı (UseHsts)
Strict-Transport-Securityüst bilgisini ekler.
- Uygulama
- HTTPS Yeniden Yönlendirme Ara Yazılımı (UseHttpsRedirection) HTTP isteklerini HTTPS'ye yeniden yönlendirir.
- Statik Dosya Ara Katmanı (UseStaticFiles), statik dosyaları döndürür ve daha fazla istek işlenmesini engeller.
- Cookie İlke Ara Yazılımı (UseCookiePolicy), uygulamanın AB Genel Veri Koruma Yönetmeliği'ne (GDPR) uymasını sağlar.
- Yönlendirme Ara Yazılımı (UseRouting) istekleri yönlendirir.
- Kimlik Doğrulaması Ara Yazılımı (UseAuthentication), kullanıcının güvenli kaynaklara erişmesine izin verilmeden önce kimliğini doğrulamaya çalışır.
- Yetkilendirme Ara Yazılımı (UseAuthorization), kullanıcıyı güvenli kaynaklara erişmesi için yetkilendirir.
- Oturum Ara Yazılımı (UseSession) oturum durumunu oluşturur ve korur. Uygulama oturum durumunu kullanıyorsa Oturum Ara Yazılımını Cookie İlke Ara Yazılımından sonra ve MVC Ara Yazılımından önçe çağırın.
- Uç Nokta Yönlendirme Ara Yazılımı (UseEndpoints ile MapRazorPages), istek işlem hattında Razor Pages uç noktaları ekler.
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
Yukarıdaki kod örneğinde WebApplicationBuilder sınıfında her ara yazılım uzantı yöntemi Microsoft.AspNetCore.Builder ad alanı aracılığıyla kullanıma sunulur.
UseExceptionHandler, işlem hattına eklenen ilk ara yazılım bileşenidir. Bu nedenle Özel Durum İşleyicisi Ara Yazılımı sonraki çağrılarda gerçekleşen tüm özel durumları yakalar.
Statik Dosya Ara Yazılımı işlem hattının başlarında çağrılır ve böylece istekleri işleyebilir ve kalan bileşenlere gitmeden kısa devre yapabilir. Statik Dosya Ara Yazılımı yetkilendirme denetimi sağlamaz. Statik Dosya Ara Yazılımı tarafından sunulan tüm dosyalar (wwwroot altındakiler de dahil) genel kullanıma açıktır. Statik dosyaların güvenliğini sağlamaya yönelik bir yaklaşım için bkz. ASP.NET Core'da statik dosyalar.
İstek Statik Dosya Ara Yazılımı tarafından işlenmezse, kimlik doğrulamasını gerçekleştiren Kimlik Doğrulaması Ara Yazılımına (UseAuthentication) geçirilir. Kimlik Doğrulaması, kimliği doğrulamamış istekleri kesmez. Kimlik Doğrulaması Ara Yazılımı isteklerin kimliğini doğrulasa da, yetkilendirme (ve reddetme) ancak MVC belirli bir Razor Sayfası veya MVC denetleyicisi ve eylem seçtikten sonra gerçekleşir.
Aşağıdaki örnek, statik dosyalara yönelik isteklerin Statik Dosya Ara Yazılımı tarafından, Yanıt Sıkıştırma Ara Yazılımından önce işlendiği bir ara yazılım sıralamasını gösterir. Bu ara yazılım sıralamasında statik dosyalar sıkıştırılamaz. Razor Pages yanıtları sıkıştırılabilir.
// Static files aren't compressed by Static File Middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.MapRazorPages();
Aşağıdaki diyagramda ASP.NET Core MVC ve Razor Pages uygulamaları için eksiksiz bir istek işleme işlem hattı gösterilir. Tipik bir uygulamada mevcut ara yazılımların nasıl sıralandığını ve özel ara yazılımların nereye eklendiğini görebilirsiniz. Senaryolarınız için mevcut ara yazılımların yeniden sıralanması veya yeni özel ara yazılımlar eklenmesi konusunda tam denetim sahibisiniz.
Yukarıdaki diyagramda Uç Nokta (Endpoint) ara yazılımı, ilgili uygulama türü (MVC veya Razor Pages) için filtre işlem hattını yürütür.
Ara yazılım bileşenlerinin Startup.Configure yöntemine eklenme sırası, isteklerde ara yazılım bileşenlerinin çağrılma sırasını ve yanıt için de ters sırayı tanımlar. Güvenlik, performans ve işlevsellik açısından bu sıralama kritik önem taşır.
Aşağıdaki Startup.Configure yöntemi, güvenlikle ilgili ara yazılım bileşenlerini normalde önerilen sırayla ekler:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Önceki kodda:
- Tek tek kullanıcı hesaplarıyla yeni web uygulaması oluşturulurken eklenmeyen ara yazılımlar açıklama satırı yapılır.
- Ara yazılımların hepsi tam olarak bu sırada görünmez ama birçoğu bu sıraya uyar. Örneğin:
Bazı senaryolarda ara yazılımların farklı sıralamaları vardır. Örneğin önbelleğe alma ve sıkıştırma sıralaması senaryoya özgüdür ve birden çok geçerli sıralama vardır. Örneğin:
app.UseResponseCaching();
app.UseResponseCompression();
Yukarıdaki kodla, sıkıştırılan yanıt önbelleğe alınarak CPU'dan tasarruf edilebilir ama sonuçta Gzip veya Brotli gibi farklı sıkıştırma algoritmalarını kullanarak bir kaynağın birden fazla gösterimini önbelleğe alabilirsiniz.
Aşağıdaki sıralama statik dosyaları birleştirerek sıkıştırılmış statik dosyaların önbelleğe alınmasını sağlar:
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Aşağıdaki Startup.Configure yöntemi, yaygın uygulama senaryoları için ara yazılım bileşenlerini ekler:
- Özel durum/hata işleme
- Uygulama
Developmentortamında çalıştığında:- Geliştirici Özel Durum Sayfası Ara Yazılımı (UseDeveloperExceptionPage) uygulama çalışma zamanı hatalarını bildirir.
- Veritabanı Hata Sayfası Ara Yazılımı veritabanı çalışma zamanı hatalarını bildirir.
- Uygulama
Productionortamında çalıştığında:- Özel Durum İşleyici Ara Yazılımı (UseExceptionHandler), aşağıdaki ara yazılımlarda oluşan özel durumları yakalar.
- HTTP Katı Aktarım Güvenliği Protokolü (HSTS) Ara Yazılımı (UseHsts)
Strict-Transport-Securityüst bilgisini ekler.
- Uygulama
- HTTPS Yeniden Yönlendirme Ara Yazılımı (UseHttpsRedirection) HTTP isteklerini HTTPS'ye yeniden yönlendirir.
- Statik Dosya Ara Katmanı (UseStaticFiles), statik dosyaları döndürür ve daha fazla istek işlenmesini engeller.
- Cookie İlke Ara Yazılımı (UseCookiePolicy), uygulamanın AB Genel Veri Koruma Yönetmeliği'ne (GDPR) uymasını sağlar.
- Yönlendirme Ara Yazılımı (UseRouting) istekleri yönlendirir.
- Kimlik Doğrulaması Ara Yazılımı (UseAuthentication), kullanıcının güvenli kaynaklara erişmesine izin verilmeden önce kimliğini doğrulamaya çalışır.
- Yetkilendirme Ara Yazılımı (UseAuthorization), kullanıcıyı güvenli kaynaklara erişmesi için yetkilendirir.
- Oturum Ara Yazılımı (UseSession) oturum durumunu oluşturur ve korur. Uygulama oturum durumunu kullanıyorsa Oturum Ara Yazılımını Cookie İlke Ara Yazılımından sonra ve MVC Ara Yazılımından önçe çağırın.
- Uç Nokta Yönlendirme Ara Yazılımı (UseEndpoints ile MapRazorPages), istek işlem hattında Razor Pages uç noktaları ekler.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Yukarıdaki kod örneğinde IApplicationBuilder sınıfında her ara yazılım uzantı yöntemi Microsoft.AspNetCore.Builder ad alanı aracılığıyla kullanıma sunulur.
UseExceptionHandler, işlem hattına eklenen ilk ara yazılım bileşenidir. Bu nedenle Özel Durum İşleyicisi Ara Yazılımı sonraki çağrılarda gerçekleşen tüm özel durumları yakalar.
Statik Dosya Ara Yazılımı işlem hattının başlarında çağrılır ve böylece istekleri işleyebilir ve kalan bileşenlere gitmeden kısa devre yapabilir. Statik Dosya Ara Yazılımı yetkilendirme denetimi sağlamaz. Statik Dosya Ara Yazılımı tarafından sunulan tüm dosyalar (wwwroot altındakiler de dahil) genel kullanıma açıktır. Statik dosyaların güvenliğini sağlamaya yönelik bir yaklaşım için bkz. ASP.NET Core'da statik dosyalar.
İstek Statik Dosya Ara Yazılımı tarafından işlenmezse, kimlik doğrulamasını gerçekleştiren Kimlik Doğrulaması Ara Yazılımına (UseAuthentication) geçirilir. Kimlik Doğrulaması, kimliği doğrulamamış istekleri kesmez. Kimlik Doğrulaması Ara Yazılımı isteklerin kimliğini doğrulasa da, yetkilendirme (ve reddetme) ancak MVC belirli bir Razor Sayfası veya MVC denetleyicisi ve eylem seçtikten sonra gerçekleşir.
Aşağıdaki örnek, statik dosyalara yönelik isteklerin Statik Dosya Ara Yazılımı tarafından, Yanıt Sıkıştırma Ara Yazılımından önce işlendiği bir ara yazılım sıralamasını gösterir. Bu ara yazılım sıralamasında statik dosyalar sıkıştırılamaz. Razor Pages yanıtları sıkıştırılabilir.
public void Configure(IApplicationBuilder app)
{
// Static files aren't compressed by Static File Middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Tek Sayfalı Uygulamalar (SPA) için, UseSpaStaticFiles SPA ara yazılımı genellikle ara yazılım işlem hattında en son gelir. SPA ara yazılımı en sondadır çünkü:
- Önce diğer tüm ara yazılımların eşleşen istekleri yanıtlamasına olanak tanınır.
- İstemci tarafı yönlendirmesi olan SPA'ların, sunucu uygulaması tarafından tanınmayan tüm yollar için çalışmasına izin verilir.
SPA'lar hakkındaki diğer ayrıntılar için React ve Angular proje şablonlarının kılavuzlarına bakın.
Tek Sayfalı Uygulamalar hakkında bilgi için React ve Angular proje şablonlarının kılavuzlarına bakın.
UseCors ve UseStaticFiles sipariş
UseCors ve UseStaticFiles siparişi hakkında daha fazla bilgi için bkz. ASP.NET Core'da Çıkış Noktaları Arası İstekleri (CORS) Etkinleştirme.
İletilen Üst Bilgiler Ara Yazılımı sırası
İletilen üst bilgi bilgilerini kullanan ara yazılımların işlenmek üzere üst bilgi değerlerini kullanabileceğinden emin olmak için İletilen Üst Bilgiler Ara Yazılımını diğer ara yazılımdan önce çalıştırın. Tanılama ve Hata İşleme Ara Yazılımı'nın ardından İletilen Üst Bilgiler Ara Yazılımını çalıştırmak için bkz. İletilen Üst Bilgiler Ara Yazılım sırası.
Yerleşik ara yazılımlar
ASP.NET Core'un en son sürümü aşağıdaki ara yazılımla birlikte yayınlanmaktadır.
UI yığını sütunu, ara yazılımların [Tümü, Blazor Web App (BWA), Razor Sayfalar ve MVC (RP/MVC)] kullanıldığı tipik ui yığınını gösterir.
Sıra sütunu istek işleme işlem hattında ara yazılımın yerleşimiyle ve ara yazılımın istek işlemeyi hangi koşullarda sonlandırabileceğiyle ilgili notlar sağlar. Ara yazılım istek işleme işlem hattında kısa devre yaptığında ve daha fazla aşağı akış ara yazılımının isteği işlemesini önlediğinde, sonlandırma ara yazılımı olarak adlandırılır. Kısa devre hakkında daha fazla bilgi için WebApplication ile ara yazılım işlem hattı oluşturma bölümüne bakın.
| Ara yazılım | Açıklama | UI yığını | Sipariş |
|---|---|---|---|
| Sahtecilik Önleyici | İstek sahteciliği önleme desteği sağlar. | Tümü | Kimlik doğrulaması ve yetkilendirmeden sonra, uç noktalardan önce. |
| Kimlik Doğrulaması | Kimlik doğrulaması desteği sağlar. | Tümü | Önce HttpContext.User gereklidir. OAuth geri çağırmaları için uç nokta. |
| Yetkilendirme | Yetkilendirme desteği sağlar. | Tümü | Kimlik Doğrulama Ara Yazılımı'nın hemen ardından. |
| Cookie Politika | Kişisel bilgilerin depolanması için kullanıcıların iznini izler, ayrıca cookie ve secure gibi SameSite alanlarında en düşük standartları zorlar. |
Tümü | Tanımlama bilgileri veren ara yazılımdan önce. Örnekler: Kimlik Doğrulaması, Oturum, MVC (TempData). |
| CORS | Kaynaklar Arası Paylaşım'ı yapılandırır. | Tümü | CORS kullanan ara yazılımdan önce.
UseCors önce UseResponseCachinggitmelidir. Daha fazla bilgi için bkz. UseCORS'un UseResponseCaching (dotnet/aspnetcore #23218) öncesinde gelmesi gerektiği açık değildir. |
| Geliştirici Özel Durum Sayfası | Yalnızca Development ortamda kullanılmak üzere tasarlanmış hata bilgilerini içeren bir sayfa oluşturur. |
Tümü | Hata oluşturan ara yazılımdan önce. Proje şablonları, ortam Development olduğunda bu ara yazılımı işlem hattındaki ilk ara yazılım olarak otomatik olarak kaydeder. |
| Tanılama | Geliştirici özel durum sayfası, özel durum işleme, durum kodu sayfaları ve yeni uygulamalar için varsayılan web sayfası sağlayan ayrı ayrı birkaç ara yazılım. | Tümü | Hata oluşturan ara yazılımdan önce. İstisnalar için terminal veya yeni uygulamalar için varsayılan web sayfasını sunma. |
| İletilen Üst Bilgiler | Proxylenmiş üst bilgileri geçerli isteğe iletir. | Tümü | Güncelleştirilmiş alanları kullanan ara yazılımdan önce. Örnekler: şema, host, istemci IP'si, yöntem. |
| Sağlık Kontrolü | ASP.NET Core uygulamasının sistem durumunu ve uygulamanın bağımlılıklarını denetler; örneğin veritabanı kullanılabilirliğini denetler. | Tümü | Bir istek sistem durumu denetimi uç noktasıyla eşleşirse sonlandırılır. |
| Başlık Yayılımı | Gelen istekteki HTTP üst bilgilerini giden HTTP İstemcisi isteklerine yayar. | ||
| Tümü | |||
| HTTP Günlüğü | HTTP İsteklerini ve Yanıtlarını günlüğe kaydeder. | Tümü | Orta katman işlem hattının başında. |
| HTTP Yöntemini Geçersiz Kılma | Gelen POST isteğinin yöntemi geçersiz kılmasına olanak tanır. | Tümü | Güncelleştirilmiş yöntemi kullanan ara yazılımdan önce. |
| HTTPS Yeniden Yönlendirme | Tüm HTTP isteklerini HTTPS'ye yeniden yönlendirir. | Tümü | URL'yi kullanan ara yazılımdan önce. |
| HTTP Katı Aktarım Güvenliği (HSTS) | Özel bir yanıt üst bilgisi ekleyen güvenlik iyileştirme ara yazılımı. | Tümü | Yanıtlar gönderilmeden önce ve istekleri değiştiren ara yazılımdan sonra. Örnekler: İletilen Üst Bilgiler, URL Yeniden Yazma. |
| MVC | MVC/Razor Pages ile istekleri işler. | RP/MVC | İstek bir yolla eşleşiyorsa sonlandırılır. |
| OWIN | OWIN tabanlı uygulamalar, sunucular ve ara yazılımlarla birlikte çalışır. | RP/MVC | OWIN Ara Yazılımı isteği tam olarak işliyorsa sonlandırıcı. |
| Çıktı Önbelleğe Alma | Yapılandırmaya dayalı olarak yanıtları önbelleğe alma desteği sağlar. | RP/MVC | Önbelleğe alma gerektiren ara yazılımdan önce. UseRouting, UseCors, UseAuthenticationve UseAuthorization önce UseOutputCachegelmelidir. |
| Yanıtları Önbelleğe Alma | Yanıtları önbelleğe almak için destek sağlar. Bunun çalışması, istemci katılımını gerektirir. Tam sunucu denetimi için çıktı önbelleğe alma özelliğini kullanın. | RP/MVC | Önbelleğe alma gerektiren ara yazılımdan önce. UseCors, UseResponseCaching öğesinden önce gelmelidir. Tarayıcılar genellikle önbelleğe almayı engelleyen istek üst bilgilerini ayarladığından, yanıt önbelleğe alma genellikle Sayfalar gibi Razor kullanıcı arabirimi uygulamaları için yararlı olmaz. Çıktı önbelleğe alma , kullanıcı arabirimi uygulamalarından yararlanır. |
| İsteğin Sıkıştırmasını Çözme | İstekleri sıkıştırmayı açma desteği sağlar. | Tümü | İstek gövdesini okuyan ara yazılımdan önce. |
| Yanıt Sıkıştırma | Yanıtları sıkıştırma desteği sağlar. | Tümü | Sıkıştırma gerektiren ara yazılımdan önce. |
| İstek Yerelleştirme | Yerelleştirme desteği sağlar. | Tümü | Yerelleştirmeye duyarlı ara yazılımdan önce. RouteDataRequestCultureProvider kullanılırken Yönlendirme Ara Yazılımından sonra gelmelidir. |
| İstek Zaman Aşımları | genel ve uç nokta başına istek zaman aşımlarını yapılandırma desteği sağlar. | Tümü | UseRequestTimeouts, UseExceptionHandlerve UseDeveloperExceptionPage'nin ardından UseRoutinggelmelidir. |
| Uç Nokta Yönlendirme. | İstek yollarını tanımlar ve kısıtlar. | Tümü | Eşleşen yollar için terminal. |
| SPA | Tek Sayfalı Uygulama (SPA) için varsayılan sayfayı döndürerek ara yazılım zincirinde bu noktadan gelen tüm istekleri işler. | Tümü | İşlem hattında doğal olarak geç belirir, bu nedenle MVC eylemleri gibi statik dosyalara hizmet veren diğer ara yazılımlar öncelik alır. |
| Oturum | Kullanıcı oturumlarını yönetmek için destek sağlar. | RP/MVC | Oturum gerektiren ara yazılımdan önce. |
| Statik Dosya | Statik dosyalara ve dizine göz atma desteği sağlar. | Tümü | İstek bir dosyayla eşleşiyorsa sonlandırılır. |
| URL Yeniden Yazma | URL'leri yeniden yazmak ve istekleri yeniden yönlendirmek için destek sağlar. | Tümü | URL'yi kullanan ara yazılımdan önce. |
| W3C Kayıt | W3C Genişletilmiş Günlük Dosyası Biçimi'nde sunucu erişim günlükleri oluşturur. | Tümü | Orta katman işlem hattının başında. |
| Blazor WebAssembly Hata ayıklama | Chromium geliştirici araçları içinde, istemci tarafı oluşturmayı (CSR) benimseyen Blazor Web App'lerin hata ayıklaması. | Geniş Bant Kablosuz Erişim (BWA) | Orta katman işlem hattının başında. |
| WebSockets | WebSockets protokolünü etkinleştirir. | Tümü | WebSocket isteklerini kabul etmek için gereken ara yazılımdan önce. |
Ek kaynaklar
- Yaşam süresi ve kayıt seçenekleri (ara yazılım örneğini içerir)
- Özel ASP.NET Core ara yazılımı yazma
- Özel ASP.NET Core ara yazılımını test etme
- ASP.NET Core'da gRPC-Web'i yapılandırma
- HTTP modüllerini ASP.NET Core ara yazılımına geçirme
- ASP.NET Core'da uygulama başlatma
- ASP.NET Core'da İstek Özellikleri
- ASP.NET Core'da fabrika tabanlı ara yazılım etkinleştirmesi
- ASP.NET Core'da üçüncü taraf bir kapsayıcıyla ara yazılım etkinleştirmesi
ASP.NET Core