Come ottenere l'azione MVC per restituire 404


142

Ho un'azione che include una stringa utilizzata per recuperare alcuni dati. Se questa stringa non restituisce alcun dato (forse perché è stato eliminato), voglio restituire un 404 e visualizzare una pagina di errore.

Attualmente uso solo restituire una vista speciale che visualizza un messaggio di errore amichevole specifico per questa azione che dice che l'elemento non è stato trovato. Funziona bene, ma idealmente vorrebbe restituire un codice di stato 404 in modo che i motori di ricerca sappiano che questo contenuto non esiste più e può rimuoverlo dai risultati di ricerca.

Qual è il modo migliore per farlo?

È semplice come impostare Response.StatusCode = 404?


devi anche mantenere Response.TrySkipIisCustomErrors = true; La risposta di @ganders è stata un salvavita ...
Tuono

Risposte:


111

Esistono diversi modi per farlo,

  1. Hai ragione nel codice aspx comune che può essere assegnato nel modo specificato
  2. throw new HttpException(404, "Some description");

1
Una cosa a cui fare attenzione è che se hai una pagina CustomError impostata per gestire 404, questa pagina di errore restituirà 200 (la pagina non trovata è stata trovata ... :-(). Tendo a gettare l'eccezione da dire BlogController e chiedi all'azione NotFound di impostare il codice di risposta corretto.
Nigel Sampson,

20
Ho finito per fare: Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; return View ("MyCustomView"); Questo funziona perfettamente nella mia situazione.
Paul Hiles,

@PaulHiles: questa è la risposta per me in MVC3. Vorrei poterlo votare come risposta piuttosto che come commento.
Valamas,

Questo non funziona, penso, se si utilizza IIS. Sul mio sito di test funziona bene, ma sul sito live entra in gioco la pagina di errore personalizzata.
Andy Brown

@AndyBrown funziona per IIS e per IIS Express, è necessario rivedere la configurazione di IIS (Console di amministrazione)
Dewfy

150

In ASP.NET MVC 3 e versioni successive è possibile restituire un HttpNotFoundResult dal controller.

return new HttpNotFoundResult("optional description");

4
utilizzo:return new HttpNotFoundResult("optional description");
Valamas il

6
Se si ritorna dall'interno del controller, esiste anche un metodo pratico chiamato HttpNotFound(). Quindi potresti return HttpNotFound("optional description")invece tornare .
Luis Perez,

1
Nel 2012 le cose non sarebbero state così convenienti ;-)
Stefan Paul Noack,

61

In MVC 4 e versioni successive è possibile utilizzare i HttpNotFoundmetodi di supporto integrati :

if (notWhatIExpected)
{
    return HttpNotFound();
}

o

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

26

Codice :

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

web.config

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

Inoltre, in questo enum sono presenti tutti i codici di stato disponibili: HttpStatusCode.
user2173353,

12

Ho usato questo:

Response.StatusCode = 404;
return null;

Grazie. Questo sembra molto meglio che generare un'eccezione costosa sul server. Mi chiedo se il 404 verrebbe registrato nei registri IIS ... idealmente lo sarebbe.
fozylet

1
Ma, in asp.net, questo metodo non è una buona soluzione, giusto? poiché la pagina Web visualizzerebbe tutte le informazioni sensibili correlate del server.
lzlstyle,

1
Un'eccezione richiederà meno di un millisecondo per essere gestita. Rispetto alle poche centinaia di millesimi di secondo solo fare una connessione HTTP su e giù non ha senso. generare HttpException o restituire HttpNotFoundResult, impostare manualmente il codice di stato e restituire null è terribile.
George,


5

In NerdDinner ad es. Prova che

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

Grazie, ma dietro le quinte, viene generata un'HttpException simile al suggerimento numero due nel post di Dewfy. Sto cercando un po 'più di controllo in modo da poter visualizzare una bella pagina di errore specifica per l'azione, non solo il reindirizzamento al controller / pagina 404 globale. Sembra che impostare il codice di stato e tornare a una vista personalizzata sia la strada da percorrere per la mia situazione.
Paul Hiles,

4

Nessuno degli esempi sopra ha funzionato per me fino a quando non ho aggiunto la linea di mezzo sotto:

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

2
Mi stai seriamente dicendo che il semplice return HttpNotFound();non ha funzionato per te? Quanti anni ha il tuo sistema?
Codice finito

1
Ci hai provato return HttpNotFound();? Funziona perfettamente con MVC 4 verso l'alto. msdn.microsoft.com/en-us/library/… "La proprietà TrySkipIisCustomErrors viene utilizzata solo quando l'applicazione è ospitata in IIS 7.0. Quando si esegue in modalità classica in IIS 7.0, il valore predefinito della proprietà TrySkipIisCustomErrors è true. Quando si esegue in modalità integrata , il valore predefinito della proprietà TrySkipIisCustomErrors è falso. "
Codice finito

2

Io uso:

Response.Status = "404 NotFound";

Questo funziona per me :-)




-1

Prova il seguente codice demo:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.