2008-10-27 41 views
38

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

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

回答

45

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

要通过代码挂钩一个模块,您可以 运行代码等代替下列 在 web.config中的HTTP模块定义:

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

+0

一个我们的模块从web.config引用时,使用工作正常,但无法直接实例化(如代码中所示),因为它被声明为朋友。 任何想法应该从哪个上下文实例化它? – Patonza 2009-12-01 11:20:47

26

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

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

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

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

+12

博客死...回页首链接:http://wayback.archive.org/web/20120719043729/http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx – felickz 2013-01-31 16:58:50

12

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

在ASP MVC的新版本,您可以使用软件包管理器添加引用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 ...); 
    } 
} 
相关问题