asp.net http-status-code-404

La mejor forma de implementar un 404 en ASP.NET



http-status-code-404 (9)

Estoy tratando de determinar la mejor forma de implementar una página 404 en una aplicación web ASP.NET estándar. Actualmente capturo errores 404 en el evento Application_Error en el archivo Global.asax y lo redirijo a una página amigable 404.aspx. El problema es que la solicitud ve un redireccionamiento 302 seguido de una página 404 faltante. ¿Hay alguna manera de evitar la redirección y responder con un 404 inmediato que contenga el mensaje de error amistoso?

¿A un rastreador web como el robot de Google le importa si la solicitud de una página no existente devuelve un 302 seguido de un 404?


¿Usas esto en cualquier lugar?

Response.Status="404 Page Not Found"


Creo que la mejor manera es utilizar el constructo de errores personalizados en su web.config como se muestra a continuación, esto permite conectar páginas para manejar todos los diferentes códigos HTTP de una manera simple y efectiva.

<customErrors mode="On" defaultRedirect="~/500.aspx"> <error statusCode="404" redirect="~/404.aspx" /> <error statusCode="500" redirect="~/500.aspx" /> </customErrors>



Maneje esto en su evento OnError de Global.asax:

protected void Application_Error(object sender, EventArgs e){ // An error has occured on a .Net page. var serverError = Server.GetLastError() as HttpException; if (serverError != null){ if (serverError.GetHttpCode() == 404){ Server.ClearError(); Server.Transfer("/Errors/404.aspx"); } } }

En su página de error, debe asegurarse de que está configurando el código de estado correctamente:

// If you''re running under IIS 7 in Integrated mode set use this line to override // IIS errors: Response.TrySkipIisCustomErrors = true; // Set status code and message; you could also use the HttpStatusCode enum: // System.Net.HttpStatusCode.NotFound Response.StatusCode = 404; Response.StatusDescription = "Page not found";

También puede manejar los varios otros códigos de error aquí bastante bien.

Generalmente, Google seguirá el 302 y luego respetará el código de estado 404, por lo que debe asegurarse de devolverlo en su página de error.


Me gusta mucho este enfoque: crea una vista única para manejar todos los tipos de error y anula IIS.

[1]: eliminar todos los ''customErrors'' y ''httpErrors'' de Web.config

[2]: comprueba que ''App_Start / FilterConfig.cs'' tiene este aspecto:

public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } }

[3]: en ''Global.asax'' agrega este método:

public void Application_Error(Object sender, EventArgs e) { Exception exception = Server.GetLastError(); Server.ClearError(); var routeData = new RouteData(); routeData.Values.Add("controller", "ErrorPage"); routeData.Values.Add("action", "Error"); routeData.Values.Add("exception", exception); if (exception.GetType() == typeof(HttpException)) { routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode()); } else { routeData.Values.Add("statusCode", 500); } Response.TrySkipIisCustomErrors = true; IController controller = new ErrorPageController(); controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); Response.End(); }

[4]: agregue ''Controladores / ErrorPageController.cs''

public class ErrorPageController : Controller { public ActionResult Error(int statusCode, Exception exception) { Response.StatusCode = statusCode; ViewBag.StatusCode = statusCode + " Error"; return View(); } }

[5]: en ''Views / Shared / Error.cshtml''

@model System.Web.Mvc.HandleErrorInfo @{ ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error"; } <h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1> //@Model.ActionName //@Model.ContollerName //@Model.Exception.Message //@Model.Exception.StackTrace

:RE


Puede configurar IIS para que devuelva páginas específicas en respuesta a cualquier tipo de error http (404 incluido).


Puede usar web.config para enviar errores 404 a una página personalizada.

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors>


Puedo ver que la configuración de la página 404 en el web.config es un buen método de limpieza, PERO aún responde inicialmente con un redireccionamiento 302 a la página de error. Como ejemplo, si navega a:

https://.com/x.aspx

serás redirigido a través de un redireccionamiento 302 a:

https://.com/404?aspxerrorpath=/x.aspx

Lo que quiero que pase es esto:

http://www.cnn.com/x.aspx

No hay redirección. Una solicitud de URL faltante devuelve un código de estado 404 con un mensaje de error amistoso.


También me enfrenté con 302 en lugar de 404. Logré solucionarlo haciendo lo siguiente:

Controlador:

public ViewResult Display404NotFoundPage() { Response.StatusCode = 404; // this line fixed it. return View(); }

Ver:

Muestra algún mensaje de error al usuario.

web.config:

<customErrors mode="On" redirectMode="ResponseRedirect"> <error statusCode="404" redirect="~/404NotFound/" /> </customErrors>

Por último, el RouthConfig:

routes.MapRoute( name: "ErrorPage", url: "404NotFound/", defaults: new { controller = "Pages", action = "Display404NotFoundPage" } );