.net एलस बाहरी विधानसभाओं में नियंत्रकों पर 404




स्काडा इन हिंदी (3)

मुझे अपने एसपीनेट एमवीसी 4 परियोजना में 404 प्रतिक्रियाओं को हल करने में परेशानी हो रही है। यह VS2012 में लक्ष्यीकरण 4.5 में बनाया गया है।

मैंने पूर्व-संकलित विचार और नियंत्रक स्टैंड-अलोन डीएलएल में बनाया है। मैं गतिशील रूप से DLL लोड करने और उन्हें मेरे मुख्य प्रोजेक्ट से निरीक्षण करने में सक्षम हूं, यहां तक ​​कि उन पर तरीकों को भी खोलें; हालांकि, ऐसा लगता है कि एमवीसी फ्रेमवर्क नियंत्रकों से अवगत नहीं है मैं यहाँ करीब हूँ, लेकिन कुछ याद आ रही है

नियंत्रकों और दृश्यों की पृष्ठभूमि

नियंत्रक एक अकेले एमवीसी परियोजना में निर्मित होते हैं और Controller से वारिस होते हैं। वहाँ पर कुछ भी दिलचस्प नहीं चल रहा है विचार रेज़र जनरेटर का उपयोग करते हैं और इस परियोजना में रहते हैं जो कक्षाएं बन जाते हैं।

परियोजना का उत्पादन एक DLL है जो सही ढंग से नियंत्रकों और विचारों को शामिल करता है।

डीएलएल एक विशिष्ट इंटरफ़ेस को लागू करते हैं, हम इसे IPlugin में एक अलग वर्ग (नियंत्रक का हिस्सा नहीं) में कहते हैं।

DLL लोड हो रहा है

विजुअल स्टूडियो में व्यवस्थापक के रूप में चल रहा है, मैं अपने ऐप को संकलित करता हूं, जिसे IIS के तहत होस्ट किया गया है। परियोजना के निर्माण के साथ, मैं अपने "प्लगइन्स" निर्देशिका में एक प्लगइन DLL ड्रॉप कर रहा हूँ। डिबगिंग के बिना (यह बाद में महत्वपूर्ण हो जाता है), मैं आईई खोलता हूं और साइट पर नेविगेट करता हूं। ध्यान दें कि इस बिंदु पर ऐप का निर्माण किया गया है, लेकिन कभी भी नहीं चला, इसलिए स्टार्टअप ईवेंट आग लग जाएंगे। अगर मैं ऐप पूल रीसायकल करता हूं तो सब कुछ अभी भी सुसंगत है।

मेरे पास दो तरीकों, PreStart और PostStart साथ एक Startup क्लास है और PostStart और WebActivator.PreApplicationStartMethod का प्रयोग करके तरीकों का आह्वान करता है।

PreStart है, जहां मैं निम्नलिखित करता हूं:

  • मेरे "प्लगइन्स" निर्देशिका में सभी प्लगइन DLL की एक सूची प्राप्त करें
  • सभी प्लगइन्स को AppDomain.CurrentDomain.DynamicDirectory कॉपी करें
  • प्रकार लोड करें ... अगर इसमें एक IPlugin I है तो
    • असेंबली को BuildManager पर जोड़ें
    • IPlugin लागू करने वाले क्लास के कुछ तरीकों पर कॉल करें

'पोस्टस्टार्ट' में मैं कोड का यह बिट करता हूं (रेजर जनरेटर। एमवीसी से कोड के आधार पर):

foreach (var assembly in Modules.Select(m=>m.Value))
{
    var engine = new PrecompiledMvcEngine(assembly)
    {
        UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal
    };

    ViewEngines.Engines.Insert(0, engine);
    VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}

इस संदर्भ में Modules एक कुंजी / मान युग्म है जहां मूल्य लोड असेंबलियां हैं। इस कोड का उद्देश्य यह सुनिश्चित करना है कि MVC प्रत्येक असेंबली के लिए दृश्य इंजन जोड़कर विचारों के बारे में जानता है जो जानता है कि कैसे विचारों को हल किया जाए (यह रेज़र जनरेटर का हिस्सा है)।

मुझे कैसे पता है कि मैं बंद हूँ (लेकिन स्पष्ट रूप से सिगार की कमी नहीं)

IPlugin ने एक विधि को परिभाषित किया है, जिसे आप RegisterRoutes अनुमान IPlugin , जहां आप इसे अनुमान IPlugin हैं, इंटरफेस को लागू करने वाले मार्गों के लिए मार्ग पंजीकृत हैं। मैं इस विधि को PreStart में कॉल करता PreStart और रूट जोड़ दिया जाता है - मैंने यह सत्यापित किया है कि ये मेरे रूट तालिका में मौजूद हैं। उदाहरण के लिए, मेरे प्लग इन में निर्धारित मार्ग पर, PreStart दौरान विधि के गतिशील आमंत्रण के माध्यम से बनाया गया, मेरे मार्गों की जांच करते समय मैं इसे एक डेटाटाकन के रूप में देखता हूं:

Namespaces = Plugin.Name.Controllers

इसलिए, मार्ग पंजीकृत है, असेंबली लोड की गई है, मैंने यह सत्यापित किया है कि DLL को AppDomain की डायनेमिक डायरेक्टरी में सही तरीके से कॉपी किया गया है। मैं उन वर्गों के सदस्यों को आमंत्रित करने में सक्षम हूं जो रनटाइम पर गतिशील रूप से लोड किए जाते हैं। लेकिन जब मैं उस URL से नेविगेट करता हूं जो कि मार्ग से मेल खाता है, मुझे 404 मिलता है । ये "व्यू" का पता लगाने में असमर्थ है YSOD, यह नियंत्रक को बिल्कुल भी नहीं ढूंढने के समान है।

यहाँ वह हिस्सा है जो मेरे से बाहर निकलता है : अगर, इस बिंदु पर, कुछ भी किए बिना, मैं विजुअल स्टूडियो पर वापस आ जाता हूं और एफ 5 मारा ... सब कुछ काम करता है

ऐसा लगता है कि दृश्य स्टूडियो नियंत्रक के बारे में कुछ तरीके से जागरूक हो रहा है जिसे मैं पहचान नहीं सकता, और उस पर एमवीसी फ्रेमवर्क उठा रहा है

अंत में, एक प्रश्न

मुझे क्या याद आ रहा है, और मैं अपने नियंत्रक के बारे में पता करने के लिए MVC फ्रेमवर्क कैसे प्राप्त करूं?

और हे, इस समय, यदि आप अभी भी इसे पढ़ रहे हैं, धन्यवाद :)


यह बताता है कि यह Asp.Net में एक बग है।

एस्पनेट टीम के एलोन लिपटन के साथ इस मुद्दे पर चर्चा करने के बाद, और यह सोच रहा था कि एमवीसी फ्रेमवर्क, एइलोन और कुछ टीम के सदस्यों ने कुछ चीजें खोदने में कुछ गलत था और पाया कि इस बातचीत के मुताबिक त्रुटि निम्न स्तर पर थी: http: //aspnetwebstack.codeplex.com/discussions/403529

उन्होंने एक वैकल्पिक हल भी सुझाया जिसमें BuildManager पर कॉल को BuildManager को कॉल करने के बाद शामिल किया गया, जिसे मैंने निम्नलिखित कोड के माध्यम से कार्यान्वित किया था:

    // Add the plugin as a reference to the application
    BuildManager.AddReferencedAssembly(assembly);
    BuildManager.AddCompilationDependency(assembly.FullName);

इससे आप अपने पूर्व-आवेदन init चरण में स्टार्टअप पर अतिरिक्त नियंत्रक / संकलित दृश्य जोड़ सकते हैं। मैं अब जो कर रहा हूं वह मेरी plugins निर्देशिका में DLL की सूची के माध्यम से पाशन कर रहा है और ऊपर के रूप में BuildManager को उन्हें BuildManager है।

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

आशा है कि इसमें किसी और को मदद मिलेगी।

चीयर्स।


यह इस समस्या की तरह दिखता है:

विभिन्न दृश्य इंजनों से दृश्य कैश प्रविष्टियों को अलग करने के लिए MVC दृश्य इंजन के विधान-योग्य प्रकार नाम का उपयोग करता है इसलिए संभव है कि एक से अधिक precompiledMvcEngine ऑब्जेक्ट (जैसा कि आप एक से अधिक विधानसभाओं में विचारों को पूर्वकल्पित करते हैं) के लिए संभव नहीं है । प्रत्येक विधानसभा के लिए PrecompiledMvcEngine से भिन्न व्युत्पन्न वर्ग बनाकर समस्या का हल किया जा सकता है। या एक एकल जेनेरिक व्युत्पन्न वर्ग बनाकर विधानसभा से कुछ प्रकार के साथ पैरामीटेट किया गया हो।

अनुच्छेद यहाँ है








assemblies