Estoy usando el software intermedio a continuación para configurar páginas de error para los códigos de estado HTTP 400 a 599. Entonces, visitar /error/400 muestra una página de error 400 Bad Request.
application.UseStatusCodePagesWithReExecute("/error/{0}"); [Route("[controller]")] public class ErrorController : Controller { [HttpGet("{statusCode}")] public IActionResult Error(int statusCode) { this.Response.StatusCode = statusCode; return this.View(statusCode); } } Sin embargo, visitar /this-page-does-not-exist da como resultado una página de error genérica de IIS 404 No encontrado.
¿Hay alguna manera de manejar las solicitudes que no coinciden con ninguna ruta? ¿Cómo puedo manejar este tipo de solicitud antes de que IIS se haga cargo? Idealmente, me gustaría reenviar la solicitud a /error/404 para que mi controlador de errores pueda manejarla.
En ASP.NET 4.6 MVC 5, teníamos que usar la sección httpErrors en el archivo Web.config para hacer esto.
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" /> <error statusCode="404" responseMode="ExecuteURL" path="/error/404/" /> </httpErrors> </system.webServer> </configuration>Uno de los mejores tutoriales que encontré es este: https://joonasw.net/view/custom-error-pages
El resumen está aquí:
1. Primero agregue un controlador como ErrorController y luego agregue esta acción:
[Route("404")] public IActionResult PageNotFound() { string originalPath = "unknown"; if (HttpContext.Items.ContainsKey("originalPath")) { originalPath = HttpContext.Items["originalPath"] as string; } return View(); } Nota: Puede agregar la acción a otro controlador existente como HomeController .
2. Ahora agregue la vista PageNotFound.cshtml . Algo como esto:
@{ ViewBag.Title = "404"; } <h1>404 - Page not found</h1> <p>Oops, better check that URL.</p> 3. Y lo importante está aquí. Agrega este código a la clase Startup , dentro del método Configure :
app.Use(async (ctx, next) => { await next(); if(ctx.Response.StatusCode == 404 && !ctx.Response.HasStarted) { //Re-execute the request so the user gets the error page string originalPath = ctx.Request.Path.Value; ctx.Items["originalPath"] = originalPath; ctx.Request.Path = "/error/404"; await next(); } }); Tenga en cuenta que debe agregarse antes de las configuraciones de enrutamiento como app.UseEndpoints... .
Según este elemento SO , IIS obtiene el 404 (y, por lo tanto, lo maneja) antes de que llegue a UseStatusCodePagesWithReExecute .
¿Has probado esto: https://github.com/aspnet/Diagnostics/issues/144 ? Sugiere finalizar la solicitud que recibió un 404 para que no vaya a IIS para su manejo. Y aquí está el código para agregar a su Inicio para hacerlo:
app.Run(context => { context.Response.StatusCode = 404; return Task.FromResult(0); });Esto parece ser un problema exclusivo de IIS.
Puede usar el respaldo en EndPoint en asp.net core como a continuación (dentro de app.UseEndpoints) y con páginas de afeitar (NotFound es una página de afeitar en la carpeta Páginas en lugar del controlador)
endpoints.MapRazorPages(); endpoints.MapFallback( context => { context.Response.Redirect("/NotFound"); return Task.CompletedTask; });