2009-05-29 16 views
10

में अशक्त नियंत्रक उदाहरण मैं अभी भी StructureMap के साथ चीजों को यह पता लगाने की कोशिश कर रहा हूँ और मुद्दों मैं में चल रहा हूँ में से एक मेरी नियंत्रक फैक्टरी उड़ा जब एक अशक्त नियंत्रक प्रकार यह करने के लिए पारित हो जाता है वर्ग है। यह तब होता है जब एप्लिकेशन पहली बार बनाता है, जिसके बाद प्रत्येक आगामी निर्माण ठीक काम करता है। यहां तक ​​कि जब मैं विजुअल स्टूडियो को बंद करता हूं और प्रोजेक्ट को फिर से खोलता हूं (मैं इसे आईआईएस में नहीं चला रहा हूं)। ऐसा लगता है कि कुछ प्रकार के कैशिंग चल रहे हैं। नियंत्रक वर्ग इस तरह दिखता है:StructureMap नियंत्रक कारखाने और MVC

public class IocControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     try 
     { 
      return (Controller)ObjectFactory.GetInstance(controllerType); 
     } 
     catch (StructureMapException) 
     { 
      System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
      throw; 
     } 
    } 
} 

क्या गलत हो सकता है? क्या मुझे हर नियंत्रक पंजीकृत होना चाहिए? धन्यवाद।

+0

इसका मतलब आपके पास एक शून्य नियंत्रक द्वारा पारित किया गया है? – David

+0

मेरा मतलब है नियंत्रक प्रकार का एक शून्य संदर्भ GetControllerInstance() को पास किया जा रहा है। जो मुझे समझ में नहीं आता वह वह जगह है जहां से नल संदर्भ आ रहा है। मुझे लगता है कि एमवीसी फ्रेमवर्क एक शून्य नियंत्रक उदाहरण गुजर रहा है? मैंने शुरू में सोचा था कि स्ट्रक्चर मैप के साथ इसका कुछ संबंध था, लेकिन यह मामला जैसा नहीं दिखता है। मुझे लगता है कि मैं विधि में एक शून्य के लिए एक चेक डाल सकता हूं, लेकिन मैं यह समझूंगा कि यह क्यों कर रहा है कि यह क्यों कर रहा है। सबसे अजीब चीज यह है कि प्रोजेक्ट खोलने के बाद ऐसा होता है और इसे रीबूट के बाद विजुअल स्टूडियो में पहली बार बनाया जाता है। यह उसके बाद हर बार काम करता है। –

+0

मैं एक ही समस्या में चल रहा हूं। किसी के पास अभी तक इसका समाधान है? –

उत्तर

5

मैं निंजा के चारों ओर एक नियंत्रक फैक्ट्री के साथ एक ही समस्या में भाग गया।

यह MVC जब यह अनुमार्गण तालिका से एक मार्ग या समाधान नहीं कर सकता है जब एक मार्ग एक कोई भी मौजूदा नियंत्रक निर्दिष्ट करता controllertype के लिए अशक्त आप पारित करेंगे लगता है। मैंने इसे हल करने के लिए दो चीजें कीं। आप अपनी रूट टेबल जांचना और एक कैचल रूट जोड़ना चाहते हैं जो .Net MVC Routing Catchall not working

पर वर्णित एक 404 त्रुटि पृष्ठ दिखाता है जो आप गलत होने पर रूटिंग डीबगर से भी जांच सकते हैं। http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

+7

एक अन्य समाधान, मौजूदा नियंत्रक फैक्ट्री को विस्तारित करते समय: जांचें कि नियंत्रक टाइप शून्य है, यदि ऐसा है तो मौजूदा फैक्ट्री को इसे स्वयं संभालने के बजाय अनुरोध को संभालने दें। –

1

मैं इसी तरह की समस्या हो रही थी। मेरा मानना ​​है कि यह अस्तित्वहीन छवियों, सीएसएस फ़ाइलें, आदि

के लिए HTTP अनुरोध था हम जानते हैं कि MVC मार्ग पहले यदि अनुरोध फ़ाइल शारीरिक रूप से मौजूद है को देखने के लिए लग रहा है। यदि ऐसा नहीं होता है तो यूआरएल कॉन्फ़िगर किए गए रूट के खिलाफ परीक्षण किया जाता है। मुझे लगता है कि ऐसी छवि के लिए अनुरोध जो शारीरिक रूप से अस्तित्व में नहीं था, रूटिंग इंजन को पास कर दिया गया था, और किसी भी मार्ग से मेल नहीं खाता था, इसलिए न्यूल का उपयोग किया गया था।

तो यह तय करने के लिए, FireBug या कुछ का उपयोग करने के लिए देखने के लिए, और ठीक, टूटी HTTP अनुरोध।

routes.IgnoreRoute("_*"); // TODO: Remove before launch 

आशा इस मदद करता है: विकास के दौरान, मैं इस तरह एक मार्ग का इस्तेमाल किया अस्थायी रूप से इन मुद्दों (मेरे संसाधन फ़ोल्डर के सभी, _Images, _Styles तरह अंडरस्कोर से प्रारंभ आदि) बायपास करने के लिए!

8

अधिकांश ब्राउज़र एक favicon.ico लिए देख रहे हैं जब आप एक साइट को लोड, और वहाँ शायद कुछ कैशिंग इस व्यवहार के साथ शामिल है, यह समझा सकती अजीब बात आप mentionned "केवल पहले निर्माण पर असफल"।

मेरे मामले में यह नियंत्रक फैक्ट्री में शून्य नियंत्रक प्रकार की समस्या का कारण बन रहा था।

ग्लोबल.एक्सएक्स में routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); जोड़ना त्रुटि को दूर करता है, अनुरोध एमवीसी के बिना फाइल सिस्टम में गिरना चाहिए, जो आपके कोड में favico.ico नियंत्रक की तलाश में है।

यहाँ मैं अपने कस्टम नियंत्रक कारखाने वर्ग में GetControllerType (स्ट्रिंग controllerName) अधिभावी और जाँच क्या controllerName मूल्य प्रत्येक अनुरोध के लिए था पर आउट हो जाते Gunnar Peipman post about this

करने के लिए एक कड़ी है।

+0

आपने समस्या का सही उत्तर दिया है;) धन्यवाद! – Rookian

+0

धन्यवाद !! यह मेरे लिए काम किया। –

0

मैं क्या लगता है कि तुम क्या करने की जरूरत बिल्कुल वही बात कि डिफ़ॉल्ट MVC नियंत्रक कारखाने GetControllerInstance विधि पर करता है। यदि आप http://aspnetwebstack.codeplex.com/ पर DefaultControllerFactory के लिए Microsoft स्रोत कोड देखते हैं तो आप देखेंगे कि DefaultControllerFactory 404 अपवाद फेंकता है जब नियंत्रक टाइप शून्य है।

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      if (controllerType == null) 
       return base.GetControllerInstance(requestContext, controllerType); 
      var controller = ObjectFactory.GetInstance(controllerType); 
      return (IController)controller; 
     } 
} 

मूल रूप से यह है कि यह सुनिश्चित करेंगे, जब उपयोगकर्ता गलत मार्ग आवेदन एक 404 त्रुटि के रूप में यह संभालती में प्रवेश करती है: यहाँ हम इसे कैसे इस जानकारी के आधार करते हैं।

+0

क्या आप कुछ और विवरण प्रदान कर सकते हैं? मुझे एक ही समस्या है और उपरोक्त समाधान मेरे लिए काम नहीं करता है (एक HttpException फेंक दिया गया है और मैं डीबगर में वापस आ गया हूँ)। क्या आपने अपने नियंत्रक फैक्ट्री में किसी भी अन्य तरीकों को ओवरराइड किया है? क्या आपने रचनाकार प्रदान किए हैं? आपने इसे ग्लोबल.एक्सएक्स में कैसे पंजीकृत किया है? भले ही मेरा कस्टम कंट्रोलर फैक्ट्री ** केवल ** मूल कार्यान्वयन को कॉल करता है, फिर भी मुझे त्रुटि मिलती है। –

+0

मैंने इसे समझ लिया। मैंने बस 'DeuggerNonUserCodeAttribute' के साथ' GetControllerInstance' को सजाया और सबकुछ अब काम करता है। –

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