以编程方式在运行时注册HttpModules

时间:2008-10-27 12:59:26

标签: asp.net web-config httpmodule

我正在编写一个应用程序,第三方供应商可以编写插件DLL并将其放入Web应用程序的bin目录中。我希望这些插件能够在必要时注册自己的HttpModule。

无论如何,我可以在运行时向管道添加或删除HttpModule,而无需在Web.Config中有相应的条目,或者在添加/删除模块时是否必须以编程方式编辑Web.Config?我知道无论哪种方式都会导致AppDomain重启,但我宁愿能够在代码中执行它,而不是为了实现相同的效果而捏造web.config。

5 个答案:

答案 0 :(得分:49)

  

必须在恰当的时候完成   HttpApplication生命周期中的时间   哪个是HttpApplication   对象初始化(多次,   每个实例一次   HttpApplication的)。唯一的方法   这项工作正确的地方是   HttpApplication Init()。

     

通过代码连接模块   运行代码如下而不是   HttpModule中的定义   web.config中:

  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's blog

答案 1 :(得分:28)

意识到这是一个老问题,但asp.net 4提供了一些可以帮助的新功能。

具体来说,ASP.NET 4提供了PreApplicationStartMethod功能,可用于以编程方式添加HttpModule。

我刚刚在http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx上发了一篇博文。

基本思想是创建派生HttpApplication,它提供在启动时动态添加HttpModule的能力,然后每当在app-domain中创建每个HttpApplication实例时,它就会将它们初始化为管道。

答案 2 :(得分:13)

dll Microsoft.Web.Infrastructure.dll在DynamicModuleUtility类中有一个方法。 该DLL随WebPages 1.0一起提供

public static class PreApplicationStartCode
{
    private static bool _startWasCalled;

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

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

答案 3 :(得分:2)

这对我来说可以动态注册。

RegisterModule(typeof(RequestLoggerModule));

public class RequestLoggerModule : IHttpModule
    { ... }

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

答案 4 :(得分:1)

在新版本的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 ... );
  }
}