Программно зарегистрировать HttpModules во время выполнения - PullRequest
43 голосов
/ 27 октября 2008

Я пишу приложение, в котором сторонние поставщики могут писать подключаемые библиотеки DLL и помещать их в каталог bin веб-приложения. Я хочу, чтобы эти плагины могли регистрировать свои собственные модули Http при необходимости.

Есть ли в любом случае, что я могу добавлять или удалять HttpModules из и в конвейер во время выполнения без соответствующей записи в Web.Config, или мне нужно программно редактировать Web.Config при добавлении / удалении модулей? Я знаю, что в любом случае произойдет перезапуск AppDomain, но я бы предпочел сделать это в коде, чем использовать f.gefig для достижения того же эффекта.

Ответы [ 5 ]

49 голосов
/ 27 октября 2008

Это должно быть сделано как раз время в жизненном цикле 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);
     }
  }

Все, что вам нужно сделать, это переопределить метод Init () HttpApplication и затем получить доступ к Init статического экземпляра метод. Init () модуля подключается событие и вперед.

Через Блог Рика Строля

28 голосов
/ 01 июля 2010

Поймите, это старый вопрос, но asp.net 4 предоставляет некоторые новые возможности, которые могут помочь здесь.

В частности, ASP.NET 4 предоставляет возможность PreApplicationStartMethod, которую можно использовать для программного добавления HttpModules.

Я только что написал в блоге об этом на http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx.

Основная идея заключается в создании производного HttpApplication, который обеспечивает возможность динамического добавления модулей HttpModules во время запуска, а затем инициализирует их в конвейер всякий раз, когда каждый экземпляр HttpApplication создается в домене приложения.

13 голосов
/ 26 ноября 2010

В 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));
    }
}
2 голосов
/ 08 января 2019

Это сработало для меня для динамической регистрации.

RegisterModule(typeof(RequestLoggerModule));

public class RequestLoggerModule : IHttpModule
    { ... }

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

1 голос
/ 09 декабря 2016

В новых версиях 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 ... );
  }
}
...