ASP.NET untuk ASP.NET migrasi IHttpModule inkremental Core
Modul adalah jenis yang mengimplementasikan IHttpModule dan digunakan dalam ASP.NET Framework untuk menghubungkan ke alur permintaan di berbagai peristiwa. Dalam aplikasi ASP.NET Core, ini idealnya harus dimigrasikan ke middleware. Namun, ada kalanya ini tidak dapat dilakukan. Untuk mendukung skenario migrasi di mana modul diperlukan dan tidak dapat dipindahkan ke middleware, adaptor System.Web mendukung penambahan modul ke ASP.NET Core.
Contoh IHttpModule
Untuk mendukung modul, instans HttpApplication harus tersedia. Jika tidak ada kustom HttpApplication yang digunakan, default akan digunakan untuk menambahkan modul. Peristiwa yang dideklarasikan dalam aplikasi kustom (termasuk Application_Start
) akan didaftarkan dan dijalankan sesuai.
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()
{
}
}
Migrasi Global.asax
Infrastruktur ini dapat digunakan untuk memigrasikan Global.asax
penggunaan jika diperlukan. Sumber dari Global.asax
adalah kustom HttpApplication dan file dapat disertakan dalam aplikasi ASP.NET Core. Karena diberi nama Global
, kode berikut dapat digunakan untuk mendaftarkannya:
builder.Services.AddSystemWebAdapters()
.AddHttpApplication<Global>();
Selama logika di dalamnya tersedia di ASP.NET Core, pendekatan ini dapat digunakan untuk memigrasikan keandalan Global.asax
secara bertahap ke ASP.NET Core.
Peristiwa autentikasi/Otorisasi
Agar peristiwa autentikasi dan otorisasi berjalan pada waktu yang diinginkan, pola berikut harus digunakan:
app.UseAuthentication();
app.UseAuthenticationEvents();
app.UseAuthorization();
app.UseAuthorizationEvents();
Jika ini tidak dilakukan, peristiwa akan tetap berjalan. Namun, itu akan selama panggilan .UseSystemWebAdapters()
.
Pengumpulan Modul HTTP
Karena modul dan aplikasi dalam ASP.NET Framework ditetapkan ke permintaan, instans baru diperlukan untuk setiap permintaan. Namun, karena mereka bisa mahal untuk dibuat, mereka dikumpulkan menggunakan ObjectPool<T>. Untuk menyesuaikan masa HttpApplication pakai instans yang sebenarnya, kumpulan kustom dapat digunakan:
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);
});
Sumber Daya Tambahan:
ASP.NET Core