HOW TO HANDLE 404 IN ASP.NET MVC?

Royce Roy

Total Post:149

Points:1043
Posted by  Royce Roy
 1011  View(s)
Ratings:
Rate this:

I am just getting started on ASP.NET MVC so bear with me. I've searched around this site and various others and have seen a few implementations of this.

EDIT: I forgot to mention I am using RC2

Using URL Routing:

routes.MapRoute(

    "Error",

     "{*url}",

     new { controller = "Errors", action = "NotFound" }  // 404s

);

The above seems to take care of requests like this (assuming default route tables setup by initial MVC project): "/blah/blah/blah/blah"

Overriding HandleUnknownAction() in the controller itself:

// 404s - handle here (bad action requested

protected override void HandleUnknownAction(string actionName) {

    ViewData["actionName"] = actionName;

    View("NotFound").ExecuteResult(this.ControllerContext);

However the previous strategies do not handle a request to a Bad/Unknown controller. For example, I do not have a "/IDoNotExist", if I request this I get the generic 404 page from the web server and not my 404 if I use routing + override.

So finally, my question is: Is there any way to catch this type of request using a route or something else in the MVC framework itself?

OR should I just default to using Web.Config customErrors as my 404 handler and forget all this? I assume if I go with customErrors I'll have to store the generic 404 page outside of /Views due to the Web.Config restrictions on direct access. Anyway any best practices or guidance is appreciated.

  1. ben reitman

    Post:96

    Points:676
    Re: How to handle 404 in ASP.NET MVC?

    Here's how I handle http exceptions:

    protected void Application_Error(object sender, EventArgs e)
    {
       Exception exception = Server.GetLastError();
       // Log the exception.
     
       ILogger logger = Container.Resolve<ILogger>();
       logger.Error(exception);
     
       Response.Clear();
     
       HttpException httpException = exception as HttpException;
     
       RouteData routeData = new RouteData();
       routeData.Values.Add("controller", "Error");
     
       if (httpException == null)
       {
           routeData.Values.Add("action", "Index");
       }
       else //It's an Http Exception, Let's handle it.
       {
           switch (httpException.GetHttpCode())
           {
              case 404:
                  // Page not found.
                  routeData.Values.Add("action", "HttpError404");
                  break;
              case 500:
                  // Server error.
                  routeData.Values.Add("action", "HttpError500");
                  break;
     
               // Here you can handle Views to other error codes.
               // I choose a General error template 
               default:
                  routeData.Values.Add("action", "General");
                  break;
          }
      }          
     
      // Pass exception details to the target error View.
      routeData.Values.Add("error", exception);
     
      // Clear the error on server.
      Server.ClearError();
     
      // Avoid IIS7 getting in the middle
      Response.TrySkipIisCustomErrors = true;
     
      // Call target Controller and pass the routeData.
      IController errorController = new ErrorController();
      errorController.Execute(new RequestContext(   
           new HttpContextWrapper(Context), routeData));
    }

      Modified On Apr-09-2018 12:50:38 AM

Answer

NEWSLETTER

Enter your email address here always to be updated. We promise not to spam!