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

我正在编写一个应用程序,第三方供应商可以编写插件DLL并将它们放到Web应用程序的bin目录中。 我希望这些插件能够根据需要注册自己的HttpModules。

无论如何,我可以添加或删除HttpModules在pipe道运行时没有在Web.Config相应的条目,或者我必须以编程方式编辑Web.Config添加/删除模块时? 我知道任何一种方式都会导致AppDomain重新启动,但我宁愿能够在代码中执行,而不是为了达到相同的效果而使用web.config。

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

通过代码连接一个模块,你可以像下面那样运行代码,而不是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()将事件挂起并closures。

通过Rick Strahl的博客

认识到这是一个古老的问题,但asp.net 4提供了一些新的function,可以在这里帮助。

具体而言,ASP.NET 4提供了一个PreApplicationStartMethodfunction,可用于以编程方式添加HttpModules。

我只是在http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx上做了一个博客文章。;

基本的想法是创build派生的HttpApplication,它提供了在启动时dynamic添加HttpModules的能力,然后每当在应用程序域内创build每个HttpApplication实例时,它就将它们初始化为pipe道。

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

在新版本的ASP MVC中,您可以使用包pipe理器添加对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 ... ); } }