page net mvc error custom asp asp.net-mvc url http-status-code-404 asp.net-routing

asp.net-mvc - net - custom error mvc 5



ASP.NET MVC 5-(HTTP Error 404.0-No encontrado) con larga URL no existente (2)

Creé un nuevo proyecto en Microsoft Visual Studio Express 2013 para Web. Es un proyecto ASP.NET MVC 5 - .NET Framework 4.5.

Quise manejarlo (no se puede encontrar el recurso):

Lo manejé usando el siguiente código.

Este código funcionará si hago algo como (/ Home / kddiede / ddiij) o (/ djdied / djie / djs), esto dará como resultado la visualización de mi página personalizada de Error.

Sin embargo, cuando intento hacer algo como (/ Home / kddiede / ddiij / dfd / sdfds / dsf / dsfds / fd), o cualquier URL larga no existente, me mostrará esto:

Código de: http://www.codeproject.com/Articles/635324/Another-set-of-ASP-NET-MVC-4-tips

Consejo 16: Personalización de pantallas de error

La página de error está en /View/Shared/Error.cshtml

Web.config

<system.web> <customErrors mode="RemoteOnly" /> </system.web>

Global.asax

protected void Application_EndRequest(Object sender, EventArgs e) { ErrorConfig.Handle(Context); }

Clase ErrorConfig

public class ErrorConfig { public static void Handle(HttpContext context) { switch (context.Response.StatusCode) { //Not authorized case 401: Show(context, 401); break; //Not found case 404: Show(context, 404); break; } } static void Show(HttpContext context, Int32 code) { context.Response.Clear(); var w = new HttpContextWrapper(context); var c = new ErrorController() as IController; var rd = new RouteData(); rd.Values["controller"] = "Error"; rd.Values["action"] = "Index"; rd.Values["id"] = code.ToString(); c.Execute(new RequestContext(w, rd)); } }

ErrorController

internal class ErrorController : Controller { [HttpGet] public ViewResult Index(Int32? id) { var statusCode = id.HasValue ? id.Value : 500; var error = new HandleErrorInfo(new Exception("An exception with error " + statusCode + " occurred!"), "Error", "Index"); return View("Error", error); } }

Este último fragmento de código del sitio web que mencioné anteriormente no se agregó en Global.asax porque ya está en FilterConfig.cs

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

Alguien sabe como arreglarlo?

Gracias por adelantado.


Resuelto Para señalar todas las URL no existentes a su página de error, haga lo siguiente:

  • Agregue el código siguiente al final de su archivo RouteConfig.cs:

    public static void RegisterRoutes(RouteCollection routes) { // Default routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); // Add this code to handle non-existing urls routes.MapRoute( name: "404-PageNotFound", // This will handle any non-existing urls url: "{*url}", // "Shared" is the name of your error controller, and "Error" is the action/page // that handles all your custom errors defaults: new { controller = "Shared", action = "Error" } ); }

  • Agregue el código a continuación a su archivo Web.config:

    <configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true"></modules> </system.webServer> <system.web> <httpRuntime relaxedUrlToFileSystemMapping="true" /> </system.web> </configuration>

Eso debería apuntar a todas las URLs no existentes como (/ad/asd/sa/das,d/asd,asd.asd+dpwd''=12=2e-21) a su página de error.


Otro enfoque sería agregar esto a su web.config dentro del elemento system.web

<system.web> <!-- ... --> <!--Handle application exceptions--> <customErrors mode="On"> <!--Avoid YSOD on 404/403 errors like this because [HandleErrors] does not catch them--> <error statusCode="404" redirect="Error/Index" /> <error statusCode="403" redirect="Error/Index" /> </customErrors> </system.web>