我正在编写一个应用程序,第三方供应商可以编写插件DLL并将其放入Web应用程序的bin目录中。我希望这些插件能够在必要时注册自己的HttpModule。
无论如何,我可以在运行时向管道添加或删除HttpModule,而无需在Web.Config中有相应的条目,或者在添加/删除模块时是否必须以编程方式编辑Web.Config?我知道无论哪种方式都会导致AppDomain重启,但我宁愿能够在代码中执行它,而不是为了实现相同的效果而捏造web.config。
答案 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()连接起来 这个事件,你走了。
答案 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
{ ... }
答案 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 ... );
}
}