मुझे अपने Asp.Net MVC 4 प्रोजेक्ट में 404 प्रतिक्रियाओं को हल करने में समस्या हो रही है। यह VS2012 लक्ष्यीकरण 4.5 में बनाया गया है।404 बाहरी असेंबली में नियंत्रकों पर
मेरे पास स्टैंड-अलोन डीएलएल में निर्मित पूर्व-संकलित विचार और नियंत्रक हैं। मैं डीएलएल को गतिशील रूप से लोड करने और उन्हें अपने मूल प्रोजेक्ट से निरीक्षण करने में सक्षम हूं, यहां तक कि उन पर विधियों का आह्वान भी करता हूं; हालांकि, ऐसा लगता है कि एमवीसी फ्रेमवर्क नियंत्रकों से अवगत नहीं है। मैं यहाँ करीब हूँ, लेकिन कुछ याद आ रही है। नियंत्रकों और दृश्य
नियंत्रकों पर
पृष्ठभूमि एक स्टैंड-अलोन MVC परियोजना में बनाया गया और Controller
से विरासत कर रहे हैं। वहां कुछ भी दिलचस्प नहीं है। विचार RazorGenerator का उपयोग करते हैं और प्रोजेक्ट में रहने वाले वर्ग बन जाते हैं।
प्रोजेक्ट का आउटपुट एक डीएलएल है जिसमें सही ढंग से नियंत्रक और विचार होते हैं।
डीएलएल एक विशिष्ट इंटरफ़ेस को लागू करते हैं, हम लाइब्रेरी में एक अलग वर्ग (नियंत्रक का हिस्सा नहीं) में IPlugin
कहेंगे।
DLLs
लोड हो रहा है दृश्य स्टूडियो में व्यवस्थापक के रूप में चल रहा है मैं अपने ऐप है, जो आईआईएस के तहत होस्ट किया गया है संकलन। प्रोजेक्ट के निर्माण के साथ, मैंने अपनी "प्लगइन्स" निर्देशिका में एक प्लगइन डीएलएल ड्रॉप किया। डिबगिंग के बिना (यह बाद में महत्वपूर्ण हो जाता है), मैं आईई खोलता हूं और साइट पर नेविगेट करता हूं। ध्यान दें कि इस बिंदु पर ऐप बनाया गया है, लेकिन कभी नहीं चलता है, इसलिए स्टार्टअप ईवेंट आग लगेंगे। यदि मैं ऐप पूल रीसायकल करता हूं तो यहां सबकुछ अभी भी सुसंगत है।
मैं दो तरीकों, PreStart
और PostStart
के साथ एक Startup
वर्ग है और क्रमश: WebActivator.PreApplicationStartMethod
और WebActivator.PostApplicationStartMethod
का उपयोग कर विधियां प्रारंभ।
PreStart
जहाँ मैं निम्न कार्य है:
- करने के लिए
AppDomain.CurrentDomain.DynamicDirectory
- लोड प्रकार मेरी "प्लग इन" निर्देशिका
- कॉपी सभी प्लग-इन में सभी प्लगइन DLLs की एक सूची प्राप्त ... अगर इसमें एक
IPlugin
मैं तो- विधानसभा BuildManager
- कॉल करने के लिए तरीकों के कुछ वर्ग है कि छोटा सा भूत पर जोड़े lements IPlugin
'PostStart' मैं कोड के इस थोड़ा प्रयास करना चाहिए (RazorGenerator.Mvc से कोड के आधार पर):
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
इस संदर्भ में एक मुख्य/मान जोड़े है, जहां मूल्य भारित असेंबली हैं। इस कोड का उद्देश्य यह सुनिश्चित करना है कि एमवीसी प्रत्येक असेंबली के लिए एक व्यू इंजन जोड़कर विचारों से अवगत है जो विचारों को हल करने के बारे में जानता है (यह रेजर जेनरेटर का हिस्सा है)।
मुझे कैसे पता मैं बंद (लेकिन स्पष्ट रूप से सिगार अभाव)
IPlugin
एक विधि RegisterRoutes
कहा जाता है जहां, आप अनुमान लगाया यह, मार्गों जो लोग इंटरफ़ेस को लागू करने के लिए पंजीकृत होने के लिए कर रहे हैं परिभाषित करता हूँ। मैं इस विधि को PreStart
में कॉल करता हूं और मार्ग जोड़े जाते हैं - मैंने सत्यापित किया है कि ये मेरी रूट तालिका में मौजूद हैं। उदाहरण के लिए, एक मार्ग PreStart
के दौरान मेरे प्लगइन, विधि के गतिशील मंगलाचरण के माध्यम से बनाया में परिभाषित पर, मैं एक DataToken के रूप में कुछ इस तरह जब मेरे मार्गों की जांच देखें:
Namespaces = Plugin.Name.Controllers
तो, मार्ग में पंजीकृत है, असेंबली लोड हो गई है, मैंने सत्यापित किया है कि डीएलएल को ऐपडोमेन की डायनामिक डायरेक्टरी में सही ढंग से कॉपी किया गया है। मैं उन कक्षाओं के सदस्यों को आमंत्रित करने में सक्षम हूं जो रनटाइम पर गतिशील रूप से लोड होते हैं। लेकिन जब मैं मार्ग से मेल खाने वाले यूआरएल पर नेविगेट करता हूं तो मुझे 404 मिलता है। यह एक "दृश्य का पता नहीं लगा सका" YSOD है, यह नियंत्रक को बिल्कुल नहीं ढूंढने के समान है।
यहां वह हिस्सा है जो मुझे से बिल्ली को भ्रमित करता है: यदि इस बिंदु पर, कुछ भी किए बिना, मैं विजुअल स्टूडियो पर वापस आ जाता हूं और F5 दबाता हूं ... सबकुछ काम करता है।
ऐसा लगता है कि विजुअल स्टूडियो नियंत्रक के बारे में जागरूक हो रहा है जिस तरह से मैं पहचान नहीं सकता, और एमवीसी फ्रेमवर्क इस पर उठा रहा है।
अंत में, प्रश्न
मैं क्या याद आ रही है, और कैसे मैं MVC फ्रेमवर्क मेरी नियंत्रक के बारे में पता होना करने के लिए मिलता है?
और हे, इस बिंदु पर, यदि आप अभी भी इसे पढ़ रहे हैं, धन्यवाद। :)
1. क्या वीएस कैसिनी का उपयोग कर चल रहा है? इसे आईआईएस एक्सप्रेस में बदलने का प्रयास करें और जांचें कि क्या यह सही तरीके से काम करता है या नहीं। 2. स्थापित करने का प्रयास करें [रूटडेबगर] (http://nuget.org/packages/routedebugger) - शायद यह आपको कुछ संकेत दे सकता है कि क्या IIS – Pranav
धन्यवाद @Pranav के तहत मार्ग सही तरीके से पंजीकृत किए जा रहे हैं, लेकिन यह पहले से ही आईआईएस पर है। मार्ग डीबगर से पता चलता है कि मार्ग काम कर रहे हैं। – MisterJames
क्या यह एक मुद्दा हो सकता है? http://stackoverflow.com/questions/14971895/using-precompiledmvcengine-findview-throws-invalidoperationex-f-looks-f – Tengiz