Share via


ASP.NET ASP.NET Core 累加式 IHttpModule 移轉

模組 是實 IHttpModule 作的型別,並用於 ASP.NET Framework 中,以在各種事件中連結至要求管線。 在 ASP.NET Core 應用程式中,這些應該最好移轉至中間件。 不過,有時無法完成此動作。 為了支援需要模組且無法移至中間件的移轉案例,System.Web 配接器支援將它們新增至 ASP.NET Core。

IHttpModule 範例

若要支援模組,必須有的 HttpApplication 實例可供使用。 如果未使用任何自定義 HttpApplication ,則會使用預設的自定義來新增模組。 在自定義應用程式中宣告的事件會 Application_Start據以註冊並執行。

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" });
});

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 Dispose()
  {
  }

  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
    }
  }
}

Global.asax 移轉

此基礎結構可用來視需要移轉的使用 Global.asax 方式。 來源 Global.asax 是自定義 HttpApplication 的 ,檔案可以包含在 ASP.NET Core 應用程式中。 由於其名稱為 Global,因此可以使用下列程式代碼來註冊它:

builder.Services.AddSystemWebAdapters()
    .AddHttpApplication<Global>()

只要 ASP.NET Core 中有可用的邏輯,這個方法就可以用來累加地將依賴 Global.asax 移轉至 ASP.NET Core。

驗證/授權事件

為了讓驗證和授權事件在所需時間執行,應該使用下列模式:

app.UseAuthentication();
app.UseAuthenticationEvents();

app.UseAuthorization();
app.UseAuthorizationEvents();

如果未這麼做,事件仍會執行。 不過,它會在的 .UseSystemWebAdapters()呼叫期間。

HTTP 模組共用

由於 ASP.NET Framework 中的模組和應用程式已指派給要求,因此每個要求都需要新的實例。 不過,由於建立成本可能很高,因此會使用 來集區 ObjectPool<T>。 若要自定義實例的實際存留期 HttpApplication ,可以使用自定義集區:

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<IPooledOjbectPolicy<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);
});

其他資源