我正在编写一个应用程序,第三方供应商可以编写插件DLL并将其放入Web应用程序的bin目录中.我希望这些插件能够在必要时注册自己的HttpModule.
无论如何,我可以在运行时向管道添加或删除HttpModule,而无需在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()连接事件,然后关闭.
通过Rick Strahl的博客
意识到这是一个老问题,但asp.net 4提供了一些可以在这里提供帮助的新功能.
具体来说,ASP.NET 4提供了一种PreApplicationStartMethod
可用于以编程方式添加HttpModule的功能.
我刚刚在http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx上发了一篇博文.
基本思想是创建一个派生HttpApplication
,它提供在启动时动态添加HttpModule的能力,然后每当HttpApplication
在app-domain中创建每个实例时,它都会将它们初始化为管道.
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)); } }