2008-10-27 6 views
38

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

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

ответ

45

Это должно быть сделано в нужное время в 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's blog Via

+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

Блог dead ... wayback link: http://wayback.archive.org/web/20120719043729/http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx – felickz 2013-01-31 16:58:50

12

dll Microsoft.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)); 
    } 
} 
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 ...); 
    } 
}