2012-06-06 17 views
6

Tengo una configuración de sitio web en IIS con un web.config configurado en la raíz para muchos virtuales de sub-aplicación (unos 35), algunos de los cuales usan sus propias anulaciones únicas/configuracionesCompartir un HttpModule entre varias subaplicaciones sin el GAC

Tengo dos HttpModules que me gustaría implementar para todas las subaplicaciones a la vez. Sin usar el GAC, ¿hay alguna forma de especificar la implementación en web.config para que estos módulos puedan aplicarse a todas las subaplicaciones sin volver a compilar el código del módulo en cada subaplicación? ¿Puedo guardar el conjunto HttpModule en algún lugar de la estructura del sitio para que pueda ser utilizado por todas las sub-aplicaciones?

Respuesta

4

Es posible registrar un módulo http en la raíz web.config (sección system.webServer/modules). El módulo debe tener un nombre fuerte (debe ser firmado):

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

Ahora IIS espera que el módulo se encuentra en el directorio bin (o en GAC). La sección dependentAssembly indica a IIS dónde puede encontrarse el archivo de ensamblaje:

<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

Puede agregar los módulos http en un dll. Ponga los archivos DLL en la carpeta bin de sus aplicaciones y hacer referencia al módulo HTTP desde el web.config

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

Suponiendo que el normal, de añadir a la configuración web y las carpetas de basura después de que el hecho de que no funciona para usted no es un par de posibilidades para que en el marco actual:

Si no le importa alterar las configuraciones de Internet, pero necesita almacenar el módulo fuera de la papelera de puede utilizar System.Web.PreApplicationStartMethod a registrar un controlador de dominio de aplicación El evento .AssemblyResolve tiene el controlador de eventos cargado y devuelve el tipo

Si no desea mod el web.config o necesitan sus eventos para estar en la parte superior de la pila como puede conseguir por GACing y alterar el web.config nivel de la máquina se puede utilizar System.Web.PreApplicationStartMethod para que el código se ejecute en el inicio solo estando en el directorio bin, entonces use Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule de las bibliotecas MVC Razor. Hacer esto le da el mismo resultado que ser el último módulo en la lista de módulos de la máquina.

Si no desea modificar la configuración web y necesita estar antes en la pila de eventos, entonces necesita hacer algo para reordenar los controladores de eventos. Necesitaba hacer esto una vez para intentar depurar algo que estaba tragando errores. Un poco hurgando en el reflector y se me ocurrió con esta función para obtener los controladores de eventos existentes

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 

Si pasa la instancia HttpApplication a ella con una eventName de obtener todos los delegados de controladores registrados, lo que le permitirá llama a RemoveEventHandler() en cada uno de ellos.

Si lo haces al evento de error, a continuación, añadir su propio controlador, a continuación, volver a agregar los delegados pre-existentes en el orden correcto entonces sus fuegos de controlador en primer lugar, antes que cualquiera de los otros manipuladores tiene la oportunidad de destrozar el incluso el estado y el resto de la aplicación parecen no ser más sabios siempre que no modifiques el estado del evento por ti mismo.

+0

Este es un consejo extremadamente útil. Gracias – NickSuperb

Cuestiones relacionadas