47

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

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

4

5 回答 5

54

它必须在 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 的博客

于 2008-10-27T14:40:53.447 回答
29

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

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

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

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

于 2010-07-01T14:32:25.367 回答
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));
    }
}
于 2010-11-26T13:52:31.163 回答
3

这对我来说适用于动态注册。

RegisterModule(typeof(RequestLoggerModule));

public class RequestLoggerModule : IHttpModule
    { ... }

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

于 2019-01-08T18:54:32.887 回答
2

在新版本的 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 ... );
  }
}
于 2016-12-09T10:48:57.603 回答