2012-06-06 6 views
6

Ich habe ein Website-Setup in IIS mit einer web.config im Stammverzeichnis für viele virtuelle Unteranwendungen (etwa 35), von denen einige ihre eigenen einzigartigen Überschreibungen verwenden/Konfigurationen.Gemeinsame Nutzung eines HttpModule zwischen mehreren Unteranwendungen ohne GAC

Ich habe zwei HttpModules, die ich für alle Unter-Apps gleichzeitig implementieren möchte. Kann die Implementierung in web.config ohne Verwendung des GAC angegeben werden, sodass diese Module auf alle Unteranwendungen angewendet werden können, ohne Modulcode in jede Unteranwendung neu zu kompilieren? Kann ich die HttpModule-Assembly irgendwo in der Site-Struktur speichern, damit sie von allen Sub-Apps verwendet werden kann?

Antwort

4

Es ist möglich, ein HTTP-Modul im Stammverzeichnis web.config (system.webServer/modules) zu registrieren. Das Modul muss einen starken Namen haben (muss unterzeichnet werden):

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

Jetzt IIS erwartet, dass das Modul in das bin-Verzeichnis (oder in GAC). dependentAssembly Abschnitt weist IIS an, wo die Assembly-Datei gefunden werden kann:

<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

Sie können die HTTP-Module in einer DLL hinzufügen. Setzen Sie den DLLs im Ordner ist Ihre Anwendungen und verweisen auf den http-Modul aus dem web.config

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

den normalen Zugabe zu dem Web-Config und ist Ordner nach der Tat der Annahme nicht funktioniert für Sie eine sind paar Möglichkeiten für Sie im aktuellen Rahmen:

Wenn Sie nichts dagegen haben die Web-configs zu verändern, müssen aber das Modul außerhalb des bin speichern Sie System.Web.PreApplicationStartMethod verwenden können, einen Handler für AppDomain registrieren Ereignis .AssemblyResolve dann muss der Ereignishandler den Typ

laden und zurückgeben

Wenn Sie die web.config nicht ändern möchten oder Ihre Ereignisse oben im Stapel haben möchten, wie Sie es durch GACing erhalten und die Webkonfiguration auf Maschinenebene ändern, können Sie System.Web.PreApplicationStartMethod verwenden Um Code beim Start zu starten, indem Sie sich im Verzeichnis bin befinden, verwenden Sie dann Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule aus den MVC Razor-Bibliotheken. Dadurch erhalten Sie ungefähr das gleiche Ergebnis wie das letzte Modul in der Maschinenmodulliste.

Wenn Sie die Webkonfiguration nicht ändern möchten und früher im Ereignisstapel sein müssen, müssen Sie etwas tun, um die Ereignishandler neu zu ordnen. Ich musste dies einmal tun, um etwas zu debuggen, das Fehler verschluckte. Ein wenig Stocher etwa in Reflektor und ich kam mit dieser Funktion bis zu erhalten, die bestehenden Event-Handler

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 

Wenn Sie passieren die Httpapplication-Instanz, um es mit einem Eventname Sie alle registrierten Handler Delegierten erhalten, die es Ihnen erlaubt, Rufen Sie RemoveEventHandler() für jeden von ihnen auf.

Wenn Sie das mit dem Fehlerereignis tun, dann fügen Sie Ihren eigenen Handler hinzu, fügen Sie dann die bereits vorhandenen Delegierten in der richtigen Reihenfolge erneut hinzu, dann wird der Handler zuerst ausgelöst, bevor einer der anderen Handler die Möglichkeit hat, den Fehler zu beheben Selbst der Zustand und der Rest der Anwendung scheinen nicht so klüger zu sein, solange Sie den Ereigniszustand nicht selbst ändern.

+0

Dies ist ein äußerst nützlicher Tipp. Vielen Dank – NickSuperb