ASP.NET migrace přírůstkového IHttpModule pro ASP.NET Core
Moduly jsou typy, které implementují IHttpModule a používají se v ASP.NET Framework k připojení ke kanálu požadavků v různých událostech. V aplikaci ASP.NET Core by se měly ideálně migrovat do middlewaru. Někdy to ale nejde udělat. Aby bylo možné podporovat scénáře migrace, ve kterých se vyžadují moduly a nelze je přesunout do middlewaru, podporují adaptéry System.Web jejich přidání do ASP.NET Core.
Příklad IHttpModule
Aby bylo možné podporovat moduly, musí být instance HttpApplication dostupná. Pokud se nepoužívá žádný vlastní HttpApplication , použije se k přidání modulů výchozí. Události deklarované ve vlastní aplikaci (včetně Application_Start
) se zaregistrují a spustí odpovídajícím způsobem.
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()
{
}
}
Migrace Global.asax
Tuto infrastrukturu Global.asax
je možné použít k migraci využití v případě potřeby. Zdroj z Global.asax
je vlastní HttpApplication a soubor lze zahrnout do aplikace ASP.NET Core. Vzhledem k tomu, že je pojmenovaná Global
, můžete k registraci použít následující kód:
builder.Services.AddSystemWebAdapters()
.AddHttpApplication<Global>();
Pokud je logika dostupná v ASP.NET Core, dá se tento přístup použít k přírůstkové migraci na Global.asax
ASP.NET Core.
Události ověřování/autorizace
Aby se události ověřování a autorizace spouštěly v požadované době, měli byste použít následující vzor:
app.UseAuthentication();
app.UseAuthenticationEvents();
app.UseAuthorization();
app.UseAuthorizationEvents();
Pokud to neukončíte, události se budou pořád spouštět. Bude však během volání .UseSystemWebAdapters()
.
Sdružování modulů HTTP
Vzhledem k tomu, že se k požadavku přiřadily moduly a aplikace v ASP.NET Framework, je pro každý požadavek potřeba nová instance. Vzhledem k tomu, že jejich vytvoření může být nákladné, jsou ve fondu pomocí ObjectPool<T>. Pokud chcete přizpůsobit skutečnou dobu života HttpApplication instancí, můžete použít vlastní fond:
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);
});