यह कैसे कस्टम त्रुटियों वास्तव में लागू कर रहे हैं की मेरी गलतफहमी है और यह भी सच है कि (IMHO), asp.net MVC के में त्रुटियों की हैंडलिंग थोड़ा गड़बड़ है की वजह से आंशिक रूप से कारण होता था।
पहला मुद्दा यह था कि मेरी कई क्रिया विधियों में, मैं किसी ऑब्जेक्ट के अस्तित्व की जांच कर रहा था उदा। एक ब्लॉग पोस्ट, और ब्लॉग पोस्ट शून्य होने पर एक HttpNotFoundResult लौट रहा है। मैं इस धारणा के तहत था कि यह तब कस्टम त्रुटि पृष्ठ प्रदर्शित करेगा जिसे मैंने 404 त्रुटियों के लिए स्थापित किया था।
हालांकि, यह मामला नहीं है। HttpNotFoundResult को लौटने से 404 तक प्रतिक्रिया का स्टेटस कोड बस सेट हो जाता है। बाकी को आईआईएस द्वारा संभाला जाता है, आईआईएस 404 त्रुटि पेज या आपके ब्राउज़र द्वारा प्रदर्शित किया जाता है यदि इसका अपना कस्टम त्रुटि पृष्ठ है। यहाँ
एक समाधान एक HttpException जो अपने कस्टम त्रुटि पृष्ठों का उपयोग करेगा के बाद से अनुरोध asp.net द्वारा नियंत्रित किया जा रहा है वापस जाने के लिए है।
मैंने एक नया एक्शन रिसेट बनाने के बजाय चुना है जिसने मुझे http स्टेटस कोड के साथ एक दृश्य निर्दिष्ट करने की अनुमति दी है। मैं इसे अपवाद फेंकने के लिए पसंद किया।
अगला मुद्दा यह था कि डिफ़ॉल्ट रूप से एक नई एमवीसी परियोजना में एक लालची मार्ग परिभाषित किया गया है। यदि आप /foo/bar
पर अनुरोध करते हैं तो डिफ़ॉल्ट MvcHandler Foo
नामक नियंत्रक की तलाश करेगा। जब इसे नहीं मिल रहा है, तो यह 404 लौटाएगा।
मैंने डिफ़ॉल्ट मार्ग हटा दिया था और उसके पास कोई लालची मार्ग नहीं था। इसका मतलब यह था कि मेरे किसी भी मार्ग से मेल नहीं होने वाले यूआरएल को एएसपीनेट द्वारा संभाला नहीं जाएगा और आईआईएस में वापस आ जाएगा।
यहाँ समाधान सभी अन्य अनुरोध से मेल खाते हैं और उन्हें एक कस्टम PageNotFound कार्रवाई, कि 404 के लिए स्थिति कोड सेट करता है और अपने कस्टम दृश्य प्रदर्शित करता है को अग्रेषित करने के लिए मेरी रूटिंग कॉन्फ़िगरेशन के तल पर एक वाइल्डकार्ड मार्ग बनाने के लिए किया गया था।
कुछ चीजों को इंगित करने लायक है।
- आईआईएस/IISExpress में आपके कस्टम त्रुटि पृष्ठों को प्रदर्शित करने के लिए आपको
httpErrors errorMode="Detailed"
सेट करने की आवश्यकता होगी। बाकी को अकेला छोड़ दिया जा सकता है।
- पथ
customErrors
अनुभाग में सेट करने से 500 त्रुटियों पर कोई प्रभाव नहीं पड़ता है।ऐसा इसलिए है क्योंकि वैश्विक HandleErrorAttribute
सभी 500 त्रुटियों को संभालता है और प्रदर्शित करने के लिए "त्रुटि" नामक दृश्य को देखता है। इसका अर्थ यह है कि यदि आपका कस्टम त्रुटि पृष्ठ वास्तव में एक नियंत्रक कार्रवाई है, तो इसे लागू नहीं किया जाएगा। उपर्युक्त सत्य है भले ही आप स्पष्ट रूप से 500 त्रुटि पृष्ठ निर्दिष्ट करते हैं।
- आपको अभी भी डिफ़ॉल्ट रेडियोधर्मी पथ रखना चाहिए, क्योंकि इसका उपयोग अन्य स्थिति कोडों के लिए किया जाएगा यदि उन्हें स्पष्ट रूप से निर्दिष्ट नहीं किया गया है।
<httpErrors errorMode="Custom">
<error responseMode="Redirect" statusCode="404" path="../missing/index.php" />
</httpErrors>
पथ यूआरएल है: ApplicationHost.config में> और निम्नलिखित के साथ बदलना -
स्रोत
2011-06-10 23:05:36
httpErrors त्रुटि मोड = "विस्तृत" मेरे लिए भाग गायब था, धन्यवाद – st78