2012-06-06 34 views
6

Bir web sitesi kurulumunda IIS'de bir web.config birçok alt uygulama sanal uygulamasının kökünde (yaklaşık 35) ayarlanmış, bazılarının kendi benzersiz geçersiz kılmalarını kullanır/konfigürasyonları.Bir HttpModule'ı GAC olmadan birden çok alt uygulama arasında paylaşma

Tüm alt uygulamalar için tek seferde uygulamak istediğim iki HttpModule'ım var. GAC'yi kullanmadan, web.config'te uygulamayı belirtmenin bir yolu var mıdır, böylece bu modüller her alt uygulamada modül kodunu yeniden derlemeden tüm alt uygulamalara uygulanabilir mi? HttpModule derlemesini site alt yapısının herhangi bir yerinde tüm alt uygulamaların kullanabileceği bir yerde saklayabilir miyim?

cevap

4

Kök web.config (system.webServer/modules bölümü) bir http modülü kaydetmek mümkündür. Modül güçlü adı olmalıdır (imzalanmalıdır):

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

Şimdi IIS modülü bin dizininde olduğunu bekler (veya GAC).

<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 modüllerini dll'ye ekleyebilirsiniz. uygulamalarınızın bin klasöründe DLL koyun ve bir orada çalışmıyor aslında sonra web config ve bin klasörlere eklemeden normale varsayarsak web.config

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

gelen http modülü başvuru geçerli çerçevesinde sizin için olanaklar birkaç:

web yapılandırmaları değiştirerek sakıncası, ancak AppDomain için bir işleyici kaydetmek için System.Web.PreApplicationStartMethod kullanabilirsiniz bin dışından modülü saklamak gerekmiyorsa .AssemblyResolve olayı sonra olay işleyici yükü var ve

türünü döndür

Web.config'i modifiye etmek istemiyorsanız veya GACing'e gore yaptığınız ve makine düzeyinde web yapılandırmasını değiştirdiğiniz gibi System.Web.PreApplicationStartMethod kümesini kullanarak yığının üst kısmında olmak için olaylarınıza ihtiyacınız varsa Başlangıçta yalnızca bin dizininde çalışarak kod çalıştırmak için daha sonra MVC Razor kitaplıklarından Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule kullanın. Bunu yapmak, makine modülü listesindeki son modülle aynı sonucu verir.

Web yapılandırmasını değiştirmek istemiyorsanız ve olay yığınında daha erken olması gerekiyorsa, olay işleyicilerini yeniden sıralamak için bir şeyler yapmanız gerekir. Yutma hataları olan bir şeyi denemek ve hata ayıklamak için bunu bir kez yapmalıydım. Bu işlevi ile geldi reflektör içinde ve yaklaşık Biraz dürtme Mevcut etkinlik işleyicileri almak için

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 

Eğer sizi sağlayacak tüm kayıtlı tanıtıcı delegelere bir eventName ile kendisine HttpApplication örneğini iletirseniz Bunların her birinde RemoveEventHandler() öğesini çağırın.

Hata olayına bunu yaparsanız, kendi işleyicinizi ekleyin, ardından önceden var olan delegeleri doğru sırada yeniden ekleyin, ardından diğer işleyicilerin herhangi birinin karışma şansı olmadan önce işleyicinizin işten çıkmasını sağlayın. Hatta durum ve uygulamanın geri kalanı olay durumunu kendiniz değiştirmediğiniz sürece akıllıca değildir.

+0

Bu son derece yararlı bir ipucu: dependentAssembly bölüm bulundu montaj dosyasını olabilir IIS talimatını verir. Teşekkürler – NickSuperb

İlgili konular