Программно зарегистрировать HttpModules во время выполнения
Я пишу приложение, где сторонние поставщики могут писать DLL файлы плагинов и переносить их в каталог bin в веб-приложении. Я хочу, чтобы эти плагины могли регистрировать свои собственные HttpModules, если это необходимо.
В любом случае я могу добавлять или удалять HttpModules из и в конвейер во время выполнения без соответствующей записи в Web.Config, или мне нужно программно редактировать Web.Config при добавлении/удалении модулей? Я знаю, что в любом случае это приведет к перезапуску AppDomain, но я предпочел бы сделать это в коде, чем придумывать web.config для достижения такого же эффекта.
Ответы
Ответ 1
Это нужно делать по праву времени в жизненном цикле 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() подключается к модулю событие и от вас.
Через Блог Рика Страхла
Ответ 2
Поймите, это старый вопрос, но asp.net 4 предоставляет некоторые новые возможности, которые могут помочь здесь.
В частности, ASP.NET 4 предоставляет функцию PreApplicationStartMethod, которая может быть использована для программного программирования HttpModules.
Я только что написал сообщение в блоге http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx.
Основная идея заключается в том, что вы создаете производную HttpApplication, которая предоставляет возможность динамически добавлять HttpModules во время запуска, а затем инициализирует их в конвейер, когда каждый экземпляр HttpApplication создается в домене приложения.
Ответ 3
У 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));
}
}
Ответ 4
В новых версиях 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 ... );
}
}