Ara yazılımı anlama
Web uygulamasının amacı HTTP isteklerini almak ve yanıtlamaktır. bir istek alınır ve sunucu uygun yanıtı oluşturur. ASP.NET Core'daki her şey bu istek/yanıt döngüsüyle ilgilidir.
ASP.NET Core uygulaması bir HTTP isteği aldığında, yanıtı oluşturmak için bir dizi bileşenden geçer. Bu bileşenler ara yazılım olarak adlandırılır. Ara yazılım, isteğin akışı yapılan bir işlem hattı olarak düşünülebilir ve her ara yazılım katmanı, işlem hattındaki bir sonraki katmandan önce ve sonra kod çalıştırabilir.
Ara yazılım ve temsilciler
Ara yazılım, nesnesini alan ve döndüren HttpContext
bir Task
temsilci olarak uygulanır.
HttpContext
nesnesi geçerli isteği ve yanıtı temsil eder. Temsilci, isteği ve yanıtı işleyen bir işlevdir.
Örneğin, aşağıdaki kodu göz önünde bulundurun:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
Önceki kodda:
-
WebApplication.CreateBuilder(args)
yeniWebApplicationBuilder
bir nesne oluşturur. -
builder.Build()
yeniWebApplication
bir nesne oluşturur. - birincisi
app.Run()
, nesnesini alan ve döndüren birHttpContext
Task
temsilci tanımlar. Temsilci yanıta "Merhaba dünya!" yazar. - İkincisi
app.Run()
uygulamayı başlatır.
Uygulama bir HTTP isteği aldığında temsilci çağrılır. Temsilci yanıta "Merhaba dünya!" yazar ve isteği tamamlar.
Zincirleme ara yazılımı
Çoğu uygulamada, sıralı olarak çalışan birden çok ara yazılım bileşeniniz vardır. İşlem hattına ara yazılım bileşenleri ekleme sırası önemlidir. Bileşenler eklendikleri sırayla çalışır.
Terminal ve terim dışı ara yazılım
Her ara yazılım, terminal veya terim dışı olarak düşünülebilir. Geçici olmayan ara yazılım isteği işler ve ardından işlem hattında bir sonraki ara yazılımı çağırır. Terminal ara yazılımı işlem hattındaki son ara yazılımdır ve çağıracak bir sonraki ara yazılımı yoktur.
ile app.Use()
eklenen temsilciler terminal veya sonlandırıcı olmayan ara yazılım olabilir. Bu temsilciler parametre olarak bir HttpContext
nesne ve nesne RequestDelegate
bekler. Temsilci genellikle içerir await next.Invoke();
. Bu işlem hattındaki bir sonraki ara yazılıma denetimi geçirir. Bu satırdan önceki kod bir sonraki ara yazılımdan önce çalışır ve bu satırdan sonraki kod bir sonraki ara yazılımdan sonra çalışır. ile app.Use()
eklenen bir temsilci, yanıt istemciye gönderilmeden önce istek üzerinde işlem yapmak için iki fırsat alır; yanıt terminal ara yazılımı tarafından oluşturulmadan önce ve yanıt terminal ara yazılımı tarafından yeniden oluşturulduktan sonra.
app.Run()
ile eklenen temsilciler her zaman sonlandırıcı ara katmandır. İşlem hattında bir sonraki ara yazılımı çağırmaz. Bunlar, çalışan son ara yazılım bileşenidir. Bir nesneyi yalnızca parametre olarak beklerler HttpContext
.
app.Run()
, terminal ara yazılımı eklemeye yönelik bir kısayoldur.
Aşağıdaki örneği inceleyin:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello from middleware 1. Passing to the next middleware!\r\n");
// Call the next middleware in the pipeline
await next.Invoke();
await context.Response.WriteAsync("Hello from middleware 1 again!\r\n");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from middleware 2!\r\n");
});
app.Run();
Önceki kodda:
-
app.Use()
şu şekilde bir ara yazılım bileşeni tanımlar:- "Ara yazılım 1'den merhaba. Yanıta sonraki ara yazılıma!" iletin.
- İsteği işlem hattındaki bir sonraki ara yazılım bileşenine geçirir ve ile
await next.Invoke()
tamamlanmasını bekler. - İşlem hattındaki bir sonraki bileşen tamamlandıktan sonra "Ara yazılım 1'den yeniden merhaba!" yazar.
- birincisi
app.Run()
, yanıta "Ara yazılım 2'den Merhaba!" yazan bir ara yazılım bileşeni tanımlar. - İkincisi
app.Run()
uygulamayı başlatır.
Çalışma zamanında, bir web tarayıcısı bu uygulamaya istek gönderdiğinde ara yazılım bileşenleri işlem hattına eklendikleri sırayla çalışır. Uygulama aşağıdaki yanıtı döndürür:
Hello from middleware 1. Passing to the next middleware!
Hello from middleware 2!
Hello from middleware 1 again!
Yerleşik ara yazılımlar
ASP.NET Core, uygulamanıza ortak işlevler eklemek için kullanabileceğiniz bir dizi yerleşik ara yazılım bileşeni sağlar. Açıkça eklenen ara yazılım bileşenlerine ek olarak, bazı ara yazılım varsayılan olarak sizin için örtük olarak eklenir. Örneğin, WebApplication.CreateBuilder()
geliştirici özel durum sayfası yönlendirme ara yazılımını ekleyen, ilgili hizmetler yapılandırılmışsa kimlik doğrulama ve yetkilendirme ara yazılımını koşullu olarak ekleyen ve uç nokta yönlendirme ara yazılımını ekleyen bir WebApplicationBuilder
döndürür.
Örneğin, aşağıdaki Program.cs dosyasını göz önünde bulundurun:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// 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.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run();
Önceki kodda:
-
app.UseExceptionHandler()
özel durumları yakalayan ve bir hata sayfası döndüren bir ara yazılım bileşeni ekler. -
app.UseHsts()
Strict-Transport-Security üst bilgisini ayarlayan bir ara yazılım bileşeni ekler. -
app.UseHttpsRedirection()
HTTP isteklerini HTTPS'ye yönlendiren bir ara yazılım bileşeni ekler. -
app.UseAntiforgery()
siteler arası istek sahteciliği (CSRF) saldırılarını önleyen bir ara yazılım bileşeni ekler. -
app.MapStaticAssets()
veapp.MapRazorComponents<App>()
rotaları uç noktalara eşleyerek uç nokta yönlendirme ara yazılımı tarafından işlenir. Uç nokta yönlendirme ara yazılımı, tarafındanWebApplicationBuilder
örtük olarak eklenir.
Uygulama türüne ve ihtiyaçlarınıza bağlı olarak, uygulamanızda kullanabileceğiniz daha birçok yerleşik ara yazılım bileşeni vardır. Listenin tamamı için belgelere bakın.
İpucu
Bu bağlamda, ile Use
başlayan yöntemler genellikle ara yazılımı eşlemeye yöneliktir. ile Map
başlayan yöntemler genellikle eşleme uç noktalarına yöneliktir.
Önemli
Sipariş ara yazılımı bileşenleri işlem hattına eklenir! Bazı ara yazılım bileşenlerinin düzgün çalışması için diğerlerinden önce çalışması gerekir. Doğru sırayı belirlemek için her ara yazılım bileşeninin belgelerine bakın.