programing

런타임에 HttpModules를 프로그래밍 방식으로 등록

muds 2023. 7. 30. 18:07
반응형

런타임에 HttpModules를 프로그래밍 방식으로 등록

저는 타사 공급업체가 플러그인 DLL을 작성하여 웹 앱의 bin 디렉터리에 넣을 수 있는 앱을 만들고 있습니다.필요한 경우 이러한 플러그인이 자체 HttpModules를 등록할 수 있는 기능을 원합니다.

웹에 해당 항목이 없어도 런타임에 파이프라인에 HttpModules를 추가하거나 제거할 수 있는 방법이 있습니까?구성 또는 웹을 프로그래밍 방식으로 편집해야 합니까?모듈을 추가/제거할 때 구성하시겠습니까?어느 쪽이든 AppDomain을 다시 시작하게 될 것이라는 것은 알고 있지만, 동일한 효과를 얻기 위해 web.config를 조작하는 것보다는 코드로 다시 시작할 수 있었으면 합니다.

HttpApplication 개체가 초기화되는 HttpApplication 수명 주기에서 적절한 시간에 수행해야 합니다(HttpApplication의 각 인스턴스에 여러 번, 한 번).이 방법이 올바르게 작동하는 유일한 방법은 HttpApplicationInit()입니다.

코드를 통해 모듈을 연결하려면 web.config의 HttpModule 정의 대신 다음과 같은 코드를 실행할 수 있습니다.

  public class Global : System.Web.HttpApplication
  {
     // some modules use explicit interface implementation
     // by declaring this static member as the IHttpModule interface
     // we work around that
     public static IHttpModule Module = new xrnsToashxMappingModule();
     public override void Init()
     {
         base.Init();
         Module.Init(this);
     }
  }

HttpApplication의 Init() 메서드를 재정의한 다음 정적 인스턴스의 Init 메서드에 액세스하기만 하면 됩니다.모듈의 Init()는 이벤트를 연결하고 종료합니다.

Rick Strahl의 블로그를 통해

이것은 오래된 질문이지만 asp.net 4는 여기에 도움이 될 수 있는 몇 가지 새로운 기능을 제공합니다.

구체적으로 ASP.NET 4는 다음을 제공합니다.PreApplicationStartMethodHttpModules를 프로그래밍 방식으로 추가하는 데 사용할 수 있는 기능입니다.

저는 방금 http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx 에 블로그 글을 올렸습니다.

기본적인 생각은 당신이 파생된 것을 만든다는 것입니다.HttpApplication시작 시 HttpModules를 동적으로 추가할 수 있는 기능을 제공하고, 매번 파이프라인으로 초기화합니다.HttpApplication인스턴스가 app-domain 내에 생성됩니다.

dll Microsoft.Web.Infrastructure.dll에는 DynamicModuleUtility 클래스 내에 이 메서드가 있습니다.dll은 웹 페이지 1.0과 함께 제공됩니다.

public static class PreApplicationStartCode
{
    private static bool _startWasCalled;

    public static void Start()
    {
        if (_startWasCalled) return;

        _startWasCalled = true;
        DynamicModuleUtility.RegisterModule(typeof(EventTriggeringHttpModule));
    }
}

ASP MVC의 새 버전에서는 Package Manager를 사용하여 WebActivatorX에 대한 참조를 추가한 다음 다음과 같은 작업을 수행할 수 있습니다.

using WhateverNameSpacesYouNeed;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(YourApp.SomeNameSpace.YourClass), "Initialize")]
namespace YourApp.SomeNameSpace
{
  public static void Initialize()
  {
    DynamicModuleUtility.RegisterModule( ... the type that implements IHttpModule ... );
  }
}

이것은 동적 등록에 효과가 있었습니다.

RegisterModule(typeof(RequestLoggerModule));

public class RequestLoggerModule : IHttpModule
    { ... }

https://learn.microsoft.com/en-us/dotnet/api/system.web.httpapplication.registermodule?view=netframework-4.7.2

언급URL : https://stackoverflow.com/questions/239802/programmatically-register-httpmodules-at-runtime

반응형