Bagikan melalui


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: