1

I'm trying to redirect to a custom page when there's an error. So I added to the Web.Config the following code

 <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Views/Error/Error500.cshtml"> <error statusCode="404" redirect="~/Views/Error/Error404"/> <error statusCode="500" redirect="~/Views/Error/Error500"/> </customErrors> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" path="~/Views/Error/Error404" responseMode="ExecuteURL" /> <remove statusCode="500" subStatusCode="-1" /> <error statusCode="500" path="~/Views/Error/Error500" responseMode="ExecuteURL" /> </httpErrors> 

But when I try localhost:23920/aFakeURl it redirects me to a blank page and it doesn't reach my ErrorController.

If I try localhost:23920/Error/Error404 it goes in my controller

// GET: /Error/Error404 public ActionResult Error404() { Response.StatusCode = 404; return View(); } 

then it returns a statusCode 404 and IIS doesn't know what to do with it and it gives me a blank page. So I'm pretty sure the problem is the path in the Web.Config.

I tried

  • ~/Views/Error/Error404"
  • ~/Views/Error/Error404.cshtml"
  • /Views/Error/Error404"
  • /Views/Error/Error404.cshtml"

It might be good to mention that when the path doesn't have a ~ it returns a runtime exception instead of a blank page.

So I have 2 questions.

  1. What's the proper way to write the Web.Config?
  2. Should I return the proper status code like this Response.StatusCode = 404; in the ErrorController?

Thank you

I don't know if it's good to mention but I use Elmah for error handling and logging. No idea if it has something to do with this problem but I read in their documentation that it should work with mode="On". Is there a better way to handle all this?

EDIT

Now I use this

 <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/Error/Error500"> <error statusCode="404" redirect="/Error/Error404"/> <error statusCode="500" redirect="/Error/Error500"/> </customErrors> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" path="/Error/Error404" responseMode="ExecuteURL" /> <remove statusCode="500" subStatusCode="-1" /> <error statusCode="500" path="/Error/Error500" responseMode="ExecuteURL" /> </httpErrors> 

but it always return an error 500 when I type a bad url.

The exception is System.Web.HttpException: The controller for path '/aBadUrllllll' was not found or does not implement IController.

How come this doesn't return a 404 error?

Do I have to change something in the Route.config?

11
  • try defaultRedirect = "~/Error/Error404". I think it should be redirected to the action, not the physical path Commented Mar 7, 2014 at 18:43
  • Is it the same for customError? I still have a blank page :( Commented Mar 7, 2014 at 18:46
  • did you update the "redirect="~/Views/Error/Error404" to action too? Commented Mar 7, 2014 at 18:48
  • Yes. Everything to "~/Error/Error404" Commented Mar 7, 2014 at 18:49
  • it may have to do with redirectMode="ResponseRewrite". ben.onfabrik.com/posts/aspnet-mvc-custom-error-pages Commented Mar 7, 2014 at 19:12

2 Answers 2

1

Is ok to place the tag: also you need specify the general errors codes and pages like this:

<system.webServer> <httpErrors errorMode="Custom" existingResponse="Auto"> <remove statusCode="403" subStatusCode="14"/> <error statusCode="403" subStatusCode="14" responseMode="ExecuteURL" path="/App/Error/Forbidden"/> <remove statusCode="404"/> <error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound"/> </httpErrors>... 

Remember creates the page NotFound in the controller Error!

Sign up to request clarification or add additional context in comments.

1 Comment

This, along with customErrors mode="On" section worked!
1

I was having similar issues and it was eventually resolved by ensuring I did all of the following:

1) customErrors mode="On" was set in web.config

2) Created an ErrorController with actions for specific errors that required a custom error page.

e.g.

 [AllowAnonymous] public virtual ActionResult NotFound(string message = "") { HttpContext.Response.StatusCode = 404; return View(); } 

3) Created a Filter.config file to add the HandleErrorAttribute and called this method in app start in global.asax.

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

4) Added global error handler in global.asax. Here's an incomplete sample of it.

 void Application_Error(object sender, EventArgs e) { var exception = Server.GetLastError(); Response.Clear(); var httpException = exception as HttpException; if (httpException != null) { var action = string.Empty; switch (httpException.GetHttpCode()) { case 401: action = "Unauthorized"; break; case 403: action = "Forbidden"; break; case 404: action = "NotFound"; break; case 500: action = "ServerError"; break; default: action = "ServerError"; break; } Server.ClearError(); Response.Redirect(string.Format("~/Error/{0}/?message={1}", action, exception.Message)); } Logger.Error("Unhandled website exception", exception); } 

With all this in place, then hard exceptions will be properly handled and intentional redirects, as well. For example, in cases upon login where a business rule was not met that prevented a user from proceeding, this was done.

return RedirectToAction("Unauthorized", "Error", new { message = "Your account is restricted from using this functionality." });

One word of advice, though, is that returning a 401 error will end up not displaying the error page and will take you to the login page, unless you handle it appropriately. I'm sure that is explained in some other post.

One other thing, and I just now discovered this when I deployed the latest to our Dev and UAT environments. In my local IIS, I was seeing the custom error pages just fine, but in other environments it was showing the default IIS pages. Routing to my ErrorController was working just fine, but the custom pages were still not showing. Turns out I needed this web.config entry

httpErrors existingResponse="PassThrough"

under system.webServer, which now makes sense.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.