2012-06-06 16 views
6

के बिना एकाधिक उप-अनुप्रयोगों के बीच एक एचटीपी मॉड्यूल साझा करना मेरे पास आईआईएस में एक वेबसाइट सेटअप है जिसमें एक वेब.कॉन्फिग कई उप-अनुप्रयोग आभासी (लगभग 35) के लिए रूट पर सेट है, जिनमें से कुछ अपने अद्वितीय ओवरराइड/विन्यास।जीएसी

मेरे पास दो HttpModules हैं जिन्हें मैं एक ही समय में सभी उप-ऐप्स के लिए कार्यान्वित करना चाहता हूं। जीएसी का उपयोग किए बिना, web.config में कार्यान्वयन को निर्दिष्ट करने का कोई तरीका है ताकि ये मॉड्यूल प्रत्येक सब-एप्लिकेशन में मॉड्यूल कोड को फिर से संकलित किए बिना सभी उप-ऐप्स पर लागू हो सकें? क्या मैं साइट संरचना में कहीं भी HttpModule असेंबली संग्रहीत कर सकता हूं जिसका उपयोग सभी उप-ऐप्स द्वारा किया जा सकता है?

उत्तर

4

रूट वेब.config (system.webServer/modules अनुभाग) में एक http मॉड्यूल पंजीकृत करना संभव है। मॉड्यूल एक मजबूत नाम होना आवश्यक है (हस्ताक्षर किया जाना चाहिए):

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

अब आईआईएस को उम्मीद है कि मॉड्यूल बिन निर्देशिका में है (या 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 मॉड्यूल जोड़ सकते हैं। अपने आवेदनों में से बिन फ़ोल्डर में DLLs रखो और web.config

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

सामान्य वेब config और बिन फ़ोल्डरों इस तथ्य के बाद में जोड़ने से यह मानते हुए से http मॉड्यूल संदर्भ तुम वहाँ एक हैं के लिए काम नहीं करता है वर्तमान ढांचे में आप के लिए संभावनाओं की जोड़ी:

आप वेब कॉन्फ़िगरेशन फेरबदल कोई आपत्ति नहीं है, लेकिन बिन बाहर मॉड्यूल स्टोर करने के लिए आप AppDomain के लिए कोई हैंडलर रजिस्टर करने के लिए उपयोग कर सकते हैं की जरूरत है System.Web.PreApplicationStartMethod .ssemblyResolve ईवेंट के बाद ईवेंट हैंडलर लोड होता है और

टाइप करें

यदि आप web.config को संशोधित नहीं करना चाहते हैं या स्टैक के शीर्ष पर होने के लिए अपनी घटनाओं की आवश्यकता है, तो आप इसे GACING करके प्राप्त करेंगे और मशीन स्तर की वेब कॉन्फ़िगरेशन को बदलकर आप System.Web.PreApplicationStartMethod का उपयोग कर सकते हैं केवल बिन निर्देशिका में होने के कारण स्टार्टअप पर चलाने के लिए कोड प्राप्त करने के लिए, तो Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.MVC रेजर पुस्तकालयों से पंजीयन मॉड्यूल का उपयोग करें। ऐसा करने से आपको मशीन मॉड्यूल सूची में अंतिम मॉड्यूल होने के समान परिणाम मिलते हैं।

यदि आप वेब कॉन्फ़िगरेशन को संशोधित नहीं करना चाहते हैं और ईवेंट स्टैक में पहले होने की आवश्यकता है तो आपको ईवेंट हैंडलर को फिर से ऑर्डर करने के लिए कुछ करने की आवश्यकता है। मुझे त्रुटियों को निगलने वाली कुछ कोशिश करने और डीबग करने के लिए इसे एक बार करने की ज़रूरत थी। के बारे में परावर्तक में है और मैं इस समारोह के साथ आया एक छोटी सी poking मौजूदा ईवेंट हैंडलर्स पाने के लिए

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 उदाहरण पार कर लेते हैं उनमें से प्रत्येक पर RemoveEventHandler() को कॉल करें।

यदि आप इसे त्रुटि ईवेंट में करते हैं, तो अपना खुद का हैंडलर जोड़ें, फिर पूर्व-मौजूदा प्रतिनिधियों को सही क्रम में दोबारा जोड़ें, फिर आपके हैंडलर को पहले आग लगती है, इससे पहले कि किसी भी अन्य हैंडलर को उलझाने का मौका मिले यहां तक ​​कि राज्य और शेष एप्लिकेशन तब तक कोई बुद्धिमान नहीं लगता है जब तक कि आप ईवेंट स्थिति को स्वयं नहीं बदलते।

+0

यह एक अत्यंत उपयोगी टिप है: dependentAssembly अनुभाग आईआईएस जहां विधानसभा फ़ाइल पाया जा सकता है निर्देश देता है। धन्यवाद – NickSuperb

संबंधित मुद्दे