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?

2 Answers 2

13

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

<configuration>
    <system.webServer>
        <httpErrors existingResponse="PassThrough" />
    </system.webServer>
</configuration>
Sign up to request clarification or add additional context in comments.

1 Comment

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.
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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.