ASP.NET Core artımlı IhttpModule geçişine ASP.NET
Modüller , çeşitli olaylarda istek işlem hattına bağlanmak için ASP.NET Framework'te uygulanan IHttpModule ve kullanılan türlerdir. ASP.NET Core uygulamasında bunlar ideal olarak ara yazılıma geçirilmelidir. Ancak, bunun yapılamayacağı zamanlar vardır. Modüllerin gerekli olduğu ve ara yazılıma taşınamadığı geçiş senaryolarını desteklemek için System.Web bağdaştırıcıları bunları ASP.NET Core'a eklemeyi destekler.
IHttpModule Örneği
Modülleri desteklemek için bir örneğinin HttpApplication kullanılabilir olması gerekir. Özel HttpApplication kullanılmazsa, modülleri eklemek için varsayılan bir tane kullanılır. Özel bir uygulamada bildirilen olaylar (dahil Application_Start
) kaydedilir ve buna göre çalıştırılır.
using System.Web;
using Microsoft.AspNetCore.OutputCaching;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSystemWebAdapters()
.AddHttpApplication<MyApp>(options =>
{
// Size of pool for HttpApplication instances. Should be what the expected concurrent requests will be
options.PoolSize = 10;
// Register a module (optionally) by name
options.RegisterModule<MyModule>("MyModule");
});
// Only available in .NET 7+
builder.Services.AddOutputCache(options =>
{
options.AddHttpApplicationBasePolicy(_ => new[] { "browser" });
});
builder.Services.AddAuthentication();
builder.Services.AddAuthorization();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthenticationEvents();
app.UseAuthorization();
app.UseAuthorizationEvents();
app.UseSystemWebAdapters();
app.UseOutputCache();
app.MapGet("/", () => "Hello World!")
.CacheOutput();
app.Run();
class MyApp : HttpApplication
{
protected void Application_Start()
{
}
public override string? GetVaryByCustomString(System.Web.HttpContext context, string custom)
{
// Any custom vary-by string needed
return base.GetVaryByCustomString(context, custom);
}
}
class MyModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest += (s, e) =>
{
// Handle events at the beginning of a request
};
application.AuthorizeRequest += (s, e) =>
{
// Handle events that need to be authorized
};
}
public void Dispose()
{
}
}
Global.asax geçişi
Bu altyapı, gerekirse kullanımını Global.asax
geçirmek için kullanılabilir. kaynağı Global.asax
özeldir HttpApplication ve dosya bir ASP.NET Core uygulamasına eklenebilir. adı Global
olduğundan, kaydetmek için aşağıdaki kod kullanılabilir:
builder.Services.AddSystemWebAdapters()
.AddHttpApplication<Global>();
içindeki mantık ASP.NET Core'da kullanılabildiği sürece, bu yaklaşım ASP.NET Core'a Global.asax
artımlı olarak dayanıklılığı geçirmek için kullanılabilir.
Kimlik Doğrulama/Yetkilendirme olayları
Kimlik doğrulaması ve yetkilendirme olaylarının istenen zamanda çalışması için aşağıdaki desen kullanılmalıdır:
app.UseAuthentication();
app.UseAuthenticationEvents();
app.UseAuthorization();
app.UseAuthorizationEvents();
Bu yapılmazsa, olaylar çalışmaya devam eder. Ancak, çağrısı .UseSystemWebAdapters()
sırasında olacaktır.
HTTP Modülü havuzu
ASP.NET Framework'teki modüller ve uygulamalar bir isteğe atandığından, her istek için yeni bir örnek gerekir. Ancak, oluşturması pahalı olabileceğinden, kullanılarak ObjectPool<T>havuza alınırlar. Örneklerin gerçek ömrünü HttpApplication özelleştirmek için özel havuz kullanılabilir:
builder.Services.TryAddSingleton<ObjectPool<HttpApplication>>(sp =>
{
// Recommended to use the in-built policy as that will ensure everything is initialized correctly and is not intended to be replaced
var policy = sp.GetRequiredService<IPooledObjectPolicy<HttpApplication>>();
// Can use any provider needed
var provider = new DefaultObjectPoolProvider();
// Use the provider to create a custom pool that will then be used for the application.
return provider.Create(policy);
});
Ek kaynaklar
ASP.NET Core