2012-06-06 3 views
6

У меня есть настройка веб-сайта в IIS с одним набором web.config, установленным в корне для многих виртуальных подприложений (около 35), некоторые из которых используют свои собственные уникальные переопределения/конфигурации.Совместное использование HttpModule между несколькими суб-приложениями без GAC

У меня есть два HttpModules, которые я хотел бы реализовать для всех суб-приложений одновременно. Без использования GAC существует ли способ указать реализацию в web.config, чтобы эти модули могли применяться ко всем суб-приложениям без повторной компиляции кода модуля в каждое под-приложение? Могу ли я сохранить сборку HttpModule где-нибудь в структуре сайта, которую он может использовать всеми суб-приложениями?

ответ

4

Возможно зарегистрировать модуль http в корневой папке web.config (system.webServer/modules). Модуль должен иметь сильное имя (должно быть подписано):

<add name="MyModule" preCondition="managedHandler" type="MyModule.Namespace, MyModuleAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bfd166351ed997df" /> 

Теперь IIS ожидает, что модуль находится в каталоге BIN (или в GAC). dependentAssembly раздел инструктирует IIS, где может быть найден файл сборки:

<runtime> 
     <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="MyModuleAssembly" publicKeyToken="bfd166351ed997df"/> 
       <codeBase version="1.0.0.0" 
          href="file://c:/SharedLibs/MyModuleAssembly.dll" /> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
1

Вы можете добавить http-модули в dll. Положите в DLLs бен папке приложений и ссылки на модуль HTTP из web.config

<add name="MyHttpModule" type="MyDll.MyHttpModule, MyDll" /> 
2

Предполагая, что нормальное добавление его в веб-конфигурации и бен папки после факта не работает для вас есть несколько возможностей для вас в нынешних рамках:

Если вы не против изменения веб-конфиги, но нужно хранить модуль снаружи бункера вы можете использовать System.Web.PreApplicationStartMethod зарегистрировать обработчик для AppDomain .AssemblyResolve, то есть загрузка обработчика события и возвращает тип

Если вы не хотите модифицировать web.config или вам нужно, чтобы ваши события находились в верхней части стека, как вы бы получили GACing и изменили веб-конфигурацию на уровне машины, вы можете использовать System.Web.PreApplicationStartMethod чтобы код запускался при запуске, просто находясь в каталоге bin, затем используйте Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule из библиотек MVC Razor. Это дает вам тот же результат, что и последний модуль в списке машинного модуля.

Если вы не хотите изменять веб-конфигурацию и должны быть раньше в стеке событий, тогда вам нужно что-то сделать, чтобы переупорядочить обработчики событий. Мне нужно было сделать это один раз, чтобы попытаться отладить что-то, что проглотило ошибки. Немного засовывать о отражателе, и я пришел с этой функцией, чтобы получить существующие обработчик событий

Dim t As Type = target.[GetType]() 

Public Function GetEventSubscribers(ByVal target As Object, ByVal eventName As String) As [Delegate]() 
    Dim w = CType(t.GetField("_events", BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.NonPublic).GetValue(target), System.ComponentModel.EventHandlerList) 
    Dim k = t.GetFields(BindingFlags.[Static] Or BindingFlags.Instance Or BindingFlags.NonPublic).Where(Function(x) x.Name.StartsWith("Event" & eventName)).Select(Function(x) x.GetValue(target)).ToList() 
    Dim d() As [Delegate] = k.SelectMany(Function(x) 
     If w(x) Is Nothing Then 
      New [Delegate]() {} 
     Else 
      Return w(x).GetInvocationList() 
     End If 
    End Function).ToArray 
    Return d 
End Function 

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

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

+0

Это чрезвычайно полезный совет. благодаря – NickSuperb

Смежные вопросы