Подтвердить что ты не робот

Программно зарегистрировать HttpModules во время выполнения

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

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

4b9b3361

Ответ 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 ... );
  }
}