404 वापस करने के लिए एमवीसी कार्रवाई कैसे करें


142

मेरे पास एक ऐसी कार्रवाई है जो एक स्ट्रिंग में होती है जो कुछ डेटा को पुनर्प्राप्त करने के लिए उपयोग की जाती है। यदि इस स्ट्रिंग में कोई डेटा वापस नहीं किया जा रहा है (हो सकता है कि इसे हटा दिया गया है), तो मैं 404 लौटना चाहता हूं और एक त्रुटि पृष्ठ प्रदर्शित करना चाहता हूं।

मैं वर्तमान में केवल एक विशेष दृश्य का उपयोग करता हूं जो इस कार्रवाई के लिए एक अनुकूल त्रुटि संदेश प्रदर्शित करता है जो कहता है कि आइटम नहीं मिला। यह ठीक काम करता है, लेकिन आदर्श रूप से एक 404 स्थिति कोड वापस करना चाहेगा ताकि खोज इंजन को पता चले कि यह सामग्री अब मौजूद नहीं है और इसे खोज परिणामों से हटा सकती है।

इस के बारे में जाने के लिए सबसे अच्छा तरीका क्या है?

यह Response.StatusCode = 404 को सेट करना जितना आसान है?


आपको Response.TrySkipIisCustomErrors = true रखना होगा; @Ganders द्वारा उत्तर दिया गया एक जीवन रक्षक था ...
थंडर

जवाबों:


111

इसे करने के कई तरीके हैं,

  1. आप सामान्य एस्पेक्स कोड में सही हैं इसे आपके निर्दिष्ट तरीके से सौंपा जा सकता है
  2. throw new HttpException(404, "Some description");

1
यह देखने के लिए एक बात है कि यदि आपके पास 404 को संभालने के लिए एक कस्टम पृष्ठ है, तो यह त्रुटि पृष्ठ 200 वापस आ जाएगा (पाया गया पृष्ठ नहीं पाया गया था: ...-()। मैं BlogController कहने से अपवाद को फेंक देता हूं। और NotFound क्रिया को उचित प्रतिक्रिया कोड निर्धारित किया है।
निगेल सैम्पसन

20
मैंने करना समाप्त कर दिया: प्रतिक्रिया। StatusCode = 404; प्रतिक्रिया। TrySkipIisCustomErrors = true; वापसी देखें ("MyCustomView"); यह मेरी स्थिति में पूरी तरह से काम करता है।
पॉल हिले

@PaHHiles: यह मेरे लिए MVC3 में उत्तर है। काश मैं इसे टिप्पणी के बजाय एक उत्तर के रूप में उभार सकता।
वलमास

यह काम नहीं करता है, मुझे लगता है, अगर आईआईएस का उपयोग कर रहा है। मेरी परीक्षण साइट पर यह ठीक काम करता है, लेकिन लाइव साइट पर कस्टम त्रुटि पृष्ठ में किक करता है।
एंडी ब्राउन

@AndyBrown यह IIS के साथ-साथ IIS एक्सप्रेस के लिए भी काम करता है, आपको IIS (एडमिन कंसोल) के अपने कॉन्फ़िगरेशन की समीक्षा करने की आवश्यकता है
Dewfy

150

ASP.NET MVC 3 और उसके बाद आप नियंत्रक से एक HttpNotFoundResult लौटा सकते हैं ।

return new HttpNotFoundResult("optional description");

4
उपयोग:return new HttpNotFoundResult("optional description");
वलमास

6
यदि आप नियंत्रक के भीतर से लौट रहे हैं तो एक सुविधा विधि भी है जिसे कहा जाता है HttpNotFound()। इसलिए आप बदले लौट सकते थे return HttpNotFound("optional description")
लुइस पेरेज़

1
2012 में चीजें वापस सुविधाजनक नहीं थीं;;
स्टीफन पॉल नैक

61

MVC 4 और इसके बाद के संस्करण में आप अंतर्निहित HttpNotFoundसहायक विधियों का उपयोग कर सकते हैं :

if (notWhatIExpected)
{
    return HttpNotFound();
}

या

if (notWhatIExpected)
{
    return HttpNotFound("I did not find message goes here");
}

26

कोड:

if (id == null)
{
  throw new HttpException(404, "Your error message");//RedirectTo NoFoundPage
}

web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>

इसके अलावा, सभी उपलब्ध स्टेटस कोड इस एनम में मौजूद हैं: HttpStatusCode।
user2173353

12

मैंने इसका उपयोग किया है:

Response.StatusCode = 404;
return null;

धन्यवाद। यह सर्वर पर महंगा अपवाद फेंकने से बेहतर है। आश्चर्य है कि अगर 404 को IIS लॉग में लॉग किया जाएगा ... आदर्श रूप से यह होगा।
3

1
लेकिन, asp.net में, यह विधि एक अच्छा समाधान नहीं है, है ना? चूंकि वेब पेज सर्वर की सभी संबंधित संवेदनशील जानकारी प्रदर्शित करेगा।
लास्लेस्टाइल

1
एक अपवाद को संभालने के लिए एक मिलीसेकंड से कम समय लगेगा। बस एक HTTP कनेक्शन करने के लिए कुछ सौ मिलिसेकंड की तुलना में और यह अर्थहीन है। HttpException को फेंकें या HttpNotFoundResult को लौटाएं, मैन्युअल रूप से स्टेटस कोड सेट करना और अशक्त लौटना भयानक है।
जॉर्ज


5

NerdDinner उदा में। यह कोशिश करो

public ActionResult Details(int? id) {
    if (id == null) {
        return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
    }
    ...
}

धन्यवाद, लेकिन पर्दे के पीछे, जो डेवफी के पोस्ट में सुझाव संख्या दो के समान एक HttpException फेंकता है। मैं थोड़ा और नियंत्रण की तलाश में हूं, इसलिए मैं कार्रवाई के लिए एक विशिष्ट त्रुटि पृष्ठ प्रदर्शित कर सकता हूं, न कि नियंत्रक / वैश्विक 404 पृष्ठ पर पुनर्निर्देशित करना। ऐसा लगता है जैसे स्थिति कोड सेट करना और कस्टम दृश्य पर वापस जाना मेरी स्थिति के लिए जाने का तरीका है।
पॉल हील्स जू

4

उपरोक्त किसी भी उदाहरण ने मेरे लिए तब तक काम नहीं किया जब तक मैंने नीचे की मध्य रेखा को नहीं जोड़ा:

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}

2
क्या आप मुझे गंभीरता से बता रहे हैं कि सरल return HttpNotFound();ने आपके लिए काम नहीं किया? आपका सिस्टम कितना पुराना है?
कोडिंग हुआ

1
क्या आपने कोशिश की return HttpNotFound();? यह MVC 4 के साथ ऊपर की तरफ ठीक काम करता है। msdn.microsoft.com/en-us/library/… "TrySkipIisCustomErrors गुण का उपयोग केवल तभी किया जाता है जब आपका एप्लिकेशन IIS 7.0 में होस्ट किया जाता है। IIS 7.0 में क्लासिक मोड में चलने पर TrySkipIisCustomErrors गुण डिफ़ॉल्ट मान सत्य है। जब एकीकृत मोड में चल रहा हो। , TrySkipIisCustomErrors गुण डिफ़ॉल्ट मान गलत है। "
कोडिंग किया गया

2

मैं उपयोग करता हूं:

Response.Status = "404 NotFound";

यह मेरे लिए काम करता है :-)


2

.NET कोर 1.1 में:

return new NotFoundObjectResult(null);

1
यदि आप कोई ऑब्जेक्ट नहीं लौटा रहे हैं, तो NotFound () लौटाएं, लेकिन अधिक उपयुक्त है, लेकिन दोनों ही स्थिति में, आपको एक फ्रेंडली एरर पेज नहीं मिलेगा, जब तक कि आप इसे StatusCodePagesWithReExecute जैसी किसी चीज़ से हैंडल नहीं करते। Devtrends.co.uk/blog/handling-404-not-found-in-asp.net-core
पॉल


-1

कृपया निम्नलिखित डेमो कोड आज़माएं:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.