Aracılığıyla paylaş


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

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 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ı Globalolduğ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:

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

Ek kaynaklar