So erhalten Sie eine MVC-Aktion zur Rückgabe von 404

142

Ich habe eine Aktion, die eine Zeichenfolge enthält, mit der einige Daten abgerufen werden. Wenn diese Zeichenfolge dazu führt, dass keine Daten zurückgegeben werden (möglicherweise weil sie gelöscht wurden), möchte ich eine 404 zurückgeben und eine Fehlerseite anzeigen.

Ich verwende derzeit nur die Rückgabe einer speziellen Ansicht, in der eine für diese Aktion spezifische Fehlermeldung angezeigt wird, dass das Element nicht gefunden wurde. Dies funktioniert einwandfrei, möchte aber im Idealfall einen 404-Statuscode zurückgeben, damit Suchmaschinen wissen, dass dieser Inhalt nicht mehr vorhanden ist, und ihn aus den Suchergebnissen entfernen können.

Was ist der beste Weg, um dies zu erreichen?

Ist es so einfach wie Response.StatusCode = 404 zu setzen?

Paul Hiles
quelle
Sie müssen auch Response.TrySkipIisCustomErrors = true beibehalten. Die Antwort von @ganders war ein Lebensretter ...
Donner

Antworten:

111

Es gibt mehrere Möglichkeiten, dies zu tun.

  1. Sie haben Recht mit dem allgemeinen Aspx-Code, der auf die von Ihnen angegebene Weise zugewiesen werden kann
  2. throw new HttpException(404, "Some description");
Dewfy
quelle
1
Eine Sache, auf die Sie achten sollten, ist, dass, wenn Sie eine customError-Seite für 404 eingerichtet haben, diese Fehlerseite 200 zurückgibt (die nicht gefundene Seite wurde gefunden ... :-(). Ich neige dazu, die Ausnahme von beispielsweise BlogController auszulösen und lassen Sie die NotFound-Aktion den richtigen Antwortcode festlegen.
Nigel Sampson
20
Am Ende habe ich Folgendes getan: Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; return View ("MyCustomView"); Das funktioniert in meiner Situation perfekt.
Paul Hiles
@PaulHiles: Dies ist die Antwort für mich in MVC3. Ich wünschte, ich könnte es eher als Antwort als als Kommentar bewerten.
Valamas
Ich denke, das funktioniert nicht, wenn IIS verwendet wird. Auf meiner Testseite funktioniert es gut, aber auf der Live-Seite wird die benutzerdefinierte Fehlerseite aktiviert.
Andy Brown
@AndyBrown es funktioniert sowohl für IIS als auch für IIS Express. Sie müssen Ihre Konfiguration von IIS (Admin-Konsole)
überprüfen
150

In ASP.NET MVC 3 und höher können Sie ein HttpNotFoundResult vom Controller zurückgeben.

return new HttpNotFoundResult("optional description");
Stefan Paul Noack
quelle
4
Verwendung:return new HttpNotFoundResult("optional description");
Valamas
6
Wenn Sie aus dem Controller zurückkehren, wird auch eine Komfortmethode aufgerufen HttpNotFound(). Sie könnten also return HttpNotFound("optional description")stattdessen zurückkehren.
Luis Perez
1
Die Dinge werden 2012 nicht so bequem sein ;-)
Stefan Paul Noack
61

In MVC 4 und höher können Sie die integrierten HttpNotFoundHilfsmethoden verwenden:

if (notWhatIExpected)
{
    return HttpNotFound();
}

oder

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

Code:

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

Web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>
Sinan BARAN
quelle
Außerdem sind alle verfügbaren Statuscodes in dieser Aufzählung vorhanden: HttpStatusCode.
user2173353
12

Ich habe das benutzt:

Response.StatusCode = 404;
return null;
Wout
quelle
Danke dir. Dies sieht viel besser aus, als eine kostspielige Ausnahme auf dem Server auszulösen. Ich frage mich, ob der 404 in IIS-Protokollen protokolliert wird ... im Idealfall.
Fozylet
1
Aber in asp.net ist diese Methode keine gute Lösung, oder? da die Webseite alle zugehörigen vertraulichen Informationen des Servers anzeigen würde.
lzlstyle
1
Eine Ausnahme dauert weniger als eine Millisekunde. Im Vergleich zu den wenigen hundert Millisekunden, die nur für eine HTTP-Verbindung erforderlich sind, ist dies bedeutungslos. HttpException auslösen oder HttpNotFoundResult zurückgeben, den Statuscode manuell festlegen und null zurückgeben ist schrecklich.
George
10

Wenn Sie mit .NET Core arbeiten, können Sie dies tun return NotFound()

Robert Paulsen
quelle
5

In NerdDinner zB. Probieren Sie es aus

public ActionResult Details(int? id) {
    if (id == null) {
        return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
    }
    ...
}
cem
quelle
Vielen Dank, aber hinter den Kulissen wird eine HttpException ausgelöst, die dem zweiten Vorschlag in Dewfys Beitrag ähnelt. Ich bin auf der Suche nach etwas mehr Kontrolle, damit ich eine nette Fehlerseite anzeigen kann, die für die Aktion spezifisch ist, und nicht nur zur Controller- / globalen 404-Seite umleiten kann. Es sieht so aus, als ob das Festlegen des Statuscodes und das Zurückkehren zu einer benutzerdefinierten Ansicht der richtige Weg für meine Situation ist.
Paul Hiles
4

Keines der obigen Beispiele hat für mich funktioniert, bis ich die mittlere Zeile unten hinzugefügt habe:

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}
Gander
quelle
2
Erzählst du mir ernsthaft, dass das Einfache return HttpNotFound();bei dir nicht funktioniert hat? Wie alt ist dein System?
Gone Coding
1
Hast du es versucht return HttpNotFound();? Es funktioniert gut mit MVC 4 abwärts. msdn.microsoft.com/en-us/library/… "Die TrySkipIisCustomErrors-Eigenschaft wird nur verwendet, wenn Ihre Anwendung in IIS 7.0 gehostet wird. Wenn sie im klassischen Modus in IIS 7.0 ausgeführt wird, ist der Standardwert der TrySkipIisCustomErrors-Eigenschaft true. Wenn sie im integrierten Modus ausgeführt wird ist der Standardwert der TrySkipIisCustomErrors-Eigenschaft false. "
Gone Coding
2

Ich benutze:

Response.Status = "404 NotFound";

Das funktioniert bei mir :-)

Bruno
quelle
2

In .NET Core 1.1:

return new NotFoundObjectResult(null);
Füttere die Hunde
quelle
1
Wenn Sie kein Objekt zurückgeben, ist die Rückgabe von NotFound () besser geeignet. In beiden Fällen wird jedoch keine benutzerfreundliche Fehlerseite angezeigt, es sei denn, Sie behandeln sie mit StatusCodePagesWithReExecute. Siehe devtrends.co.uk/blog/handling-404-not-found-in-asp.net-core
Paul Hiles
0

Sie können auch tun:

        if (response.Data.IsPresent == false)
        {
            return StatusCode(HttpStatusCode.NoContent);
        }
Christof Mehlstäubler
quelle
-1

Bitte versuchen Sie den folgenden Demo-Code:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
user4326800
quelle