Предполагая, что нормальное добавление его в веб-конфигурации и бен папки после факта не работает для вас есть несколько возможностей для вас в нынешних рамках:
Если вы не против изменения веб-конфиги, но нужно хранить модуль снаружи бункера вы можете использовать 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() для каждого из них.
Если вы делаете это с событием ошибки, добавьте свой собственный обработчик, а затем повторно добавьте предварительно существующих делегатов в правильном порядке, после чего ваш обработчик начнет огонь первым, прежде чем любой из других обработчиков сможет заблокировать даже состояние и остальная часть приложения кажутся не более мудрыми, если вы сами не изменяете состояние события.
Это чрезвычайно полезный совет. благодаря – NickSuperb