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

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

有帮助吗?

解决方案

  

必须在恰当的时候完成   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的博客

其他提示

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

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

我刚刚在 http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx

基本思想是创建一个派生的 HttpApplication ,它提供了在启动时动态添加HttpModule的能力,然后每当 HttpApplication 实例是每个 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));
    }
}

这对我来说是动态注册的。

RegisterModule(typeof(RequestLoggerModule));

public class RequestLoggerModule : IHttpModule
    { ... }

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

在新版本的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 ... );
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top