6

I'm using MVC 5 and I'm handling my errors with a custom views for errors such as (404, 403.. etc) It works fine on my local IIS but when I publish on a staging server it shows the IIS server error messages regarding these error codes.

It's showing this message:

Showing this message

instead of:

instead of this

I have modified the web.config for <customErrors mode="Off" />

Global.asax

        if ((Context.Server.GetLastError() is UnauthorizedAccessException))
        {
            log.LogError(Context.Server.GetLastError().Message, Context.Server.GetLastError());
            customErrorPage = @"~/Error/?id=403"; //security
        }
        else if ((Context.Server.GetLastError() is HttpException) && (((HttpException)Context.Server.GetLastError()).GetHttpCode() == 404))
        {
            //** Handle 404 error and response code
            log.LogError("404", Context.Server.GetLastError());
            customErrorPage = @"~/Error/?id=404";
        }
        else
        {
            log.LogError(Context.Server.GetLastError().Message, Context.Server.GetLastError());
            customErrorPage = @"~/Error";
        }

        if (ConfigurationHelper.Common.ShowCustomErrorPage)
        {
            var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
            Response.Redirect(urlHelper.Content(customErrorPage), false);
            Server.ClearError();
        }

Error controller:

    public ActionResult Index(string id)
    {
        if (!string.IsNullOrEmpty(id) && id.Equals("404"))
        {
            Response.StatusCode = 404;
            return !Request.IsAjaxRequest() ? (ActionResult)View("404") : PartialView("404");
        }
        if (!string.IsNullOrEmpty(id) && id.ToLower().Equals("403"))
        {
            Response.StatusCode = 403;
            return !Request.IsAjaxRequest() ? (ActionResult)View("Security") : PartialView("Security");
        }
        return !Request.IsAjaxRequest() ? (ActionResult)View("Index") : PartialView("Index");
    }

What should I do in-order to show my custom error messages?

SVI
  • 921
  • 4
  • 11
  • 23

2 Answers2

12

Just add the following web.config configuration to pass through IIS default error handling behavior

<configuration>
    <system.webServer>
        <httpErrors existingResponse="PassThrough" />
    </system.webServer>
</configuration>
Samer Shawish
  • 221
  • 2
  • 7
  • That works just great but it will completely remove IIS level 404 error handling. If you have a URL that is not handled by ASP.NET engine, it won't return 404 not found error. – Ankur-m May 08 '15 at 10:53
3

Try to use

Response.TrySkipIisCustomErrors = true;

at your controller. It's better than the

<httpErrors existingResponse="PassThrough" />

as the PassThrough can cause some results you don't always expect. For example read here how it will make custom error module return blank response if modules don’t set any text.

BornToCode
  • 9,495
  • 9
  • 66
  • 83