5

में ठीक से काम नहीं मेरे पास है मेरे Global.asax के निचले भाग में निम्नलिखित मार्ग:MVC: 404 मार्ग उत्पादन

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

कौन सा दृश्य स्टूडियो में ठीक काम करता है, लेकिन उत्पादन में मैं आईआईएस त्रुटि मिल रही है पृष्ठ।

इस मार्ग को कोई यूआरएल अन्य लोगों द्वारा पकड़ा नहीं गया है, इसलिए आईआईएस के परिप्रेक्ष्य से 404s नहीं है? क्या web.config में मुझे कुछ और करने की ज़रूरत है?

नोट: मैं नहीं 404-विशिष्ट URL पर रीडायरेक्ट करना चाहता हूं; बल्कि मैं अनुरोधित यूआरएल पर 404 त्रुटि पेज की सेवा कर रहा हूं (मुझे विश्वास है कि यह उपयोगिता बिंदु से उचित दृष्टिकोण है)।

अद्यतन
मेरी त्रुटि नियंत्रक में, मैं Response.StatusCode = 404; सेट कर रहा हूं, जो इस मुद्दे को हो रहा है। जब मैं इसे हटा देता हूं और फिर उत्पादन में तैनाती करता हूं, तो मुझे फिर से अपने दोस्ताना त्रुटि पृष्ठ मिल रहे हैं। एसईओ प्रयोजनों के लिए - - हालांकि, मैं मैं HTTP शीर्ष लेख में 404 स्थिति की आवश्यकता है विश्वास करते हैं तो मेरे सवाल का अब हो जाता है:

संशोधित प्रश्न
कैसे/क्यों आईआईएस प्रतिक्रिया में अवरोध डालने और उसके भेज रहा है आउट-ऑफ-द-बॉक्स 404 त्रुटि, और मैं इसे कैसे रोकूं?

** समाधान * *
Dommer Response.TrySkipIisCustomErrors=true; जो (मुझे लगता है कि) जरूरी हो गया था सुझाव देने के लिए पुरस्कार हो जाता है। लेकिन वहाँ 2 अन्य मुख्य विवरण इस प्रकार थे:

  • कस्टम त्रुटियों web.config में पर होने की जरूरत है (ओह!), और
  • 404 कार्यवाही [HandleErrors] विशेषता होनी चाहिए।

यह हर जगह काम
कुछ यूआरएल के बाद से 404 पृष्ठ पर "404-PageNotFound" के अलावा अन्य लेकिन अमान्य पैरामीटर युक्त मार्गों को मैप किया जा सकता है, और के बाद से मैं नहीं करना चाहती अनुप्रेषित बनाना, मैं अपने आधार नियंत्रक में इस कार्रवाई बनाया:

[HandleError] 
public ActionResult NotFound() 
{ 
    Response.StatusCode = 404; 
    Response.TrySkipIisCustomErrors = true;  
    return View("PageNotFound", SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));   
} 

और किसी भी नियंत्रक कार्रवाई उस आधार को विरासत में, मैं बस जब भी मैं गलत मार्ग पैरामीटर पकड़ने इस कॉल करने की आवश्यकता:

return NotFound(); 

ध्यान दें: नहीं RedirectToAction() केक पर

आइसिंग:
मॉडल मैं उत्पन्न करने और देखने में पारित कर दिया है, वह हमारी खोज इंजन में URL के शब्दों वाले बिट्स खिला के बारे में है , और अनुकूल 404 पेज पर सुझाव के रूप में शीर्ष 3 परिणाम प्रदर्शित करना।

+0

खुशी है कि आप इस काम के मिल की तरह से प्रयास करें। यह बहुत अच्छा लग रहा है! –

उत्तर

4

समस्या यह है कि आपका अनुरोध आपके पहले के रूटों में से एक से मेल खाता है और फिर असफल रहा है। सम्भावित समाधान इस तरह अन्य मार्गों को बाधित करने की कोशिश करने के लिए है:

// This will match too many things, so let's constrain it to those we know are valid 
    routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { controller = "Home|OtherController|AnotherController|..." } // regular expression matching all valid controllers 
); 

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

आप एक अधिक व्यापक जवाब चाहते हैं, तो इसे देखो: How can I properly handle 404 in ASP.NET MVC?

संपादित करें:

छुटकारा पाने के लिए कस्टम आईआईएस त्रुटि का उपयोग करने के लिए अपने त्रुटि नियंत्रक को बदलने का प्रयास करें:

Response.StatusCode = 404; 
Response.TrySkipIisCustomErrors=true; // add this line 

MSDN दस्तावेज़: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

+0

बाहर निकलता है यह एक मार्ग-मिलान समस्या नहीं है। इसके बजाय, मुझे संदेह है, यह एक आईआईएस 7 सेटिंग्स की समस्या है। कृपया प्रश्न में मेरा अपडेट देखें। – Faust

+0

मैंने थोड़ा जोड़ा है जो मदद करनी चाहिए। –

+0

ध्यान दें कि आपने मध्य में एक अतिरिक्त "i" के साथ TrySkipIisCustomErrors को गलत तरीके से गलत बताया है। – Faust

0

इस

routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "account", action = "index", id = UrlParameter.Optional } // Parameter defaults 
      ); 


routes.MapRoute(
         "404-PageNotFound", // Route name 
         "{*url}", 
         new { controller = "Error", action = "PageNotFound", id = UrlParameter.Optional } // Parameter defaults 
        ); 
+0

@ प्रसाद: 404 मार्ग का उद्देश्य सभी अप्रत्याशित अनुरोधों को पकड़ना है, इसलिए एक वाइल्ड-कार्ड {* url} मार्ग-पैटर्न काफी आवश्यक है - {नियंत्रक}/{action} नहीं करेगा। बीटीडब्लू: मैंने अपनी समस्या के बारे में अधिक जानकारी प्राप्त की है, और सवाल को संशोधित किया है। – Faust

+0

मैंने कोड – Prasanth

+0

संपादित किया है मुझे लगता है कि आईआईएस में एक DNS सेटिंग रीडायरेक्ट आवश्यक है। आवश्यकता के अनुसार पुनर्निर्देशन करने के लिए DNS सेट करने का प्रयास करें – Prasanth

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