6

我正在使用 MVC 5,我正在使用自定义视图处理错误,例如(404、403 .. 等)它在我的本地 IIS 上运行良好,但是当我在临时服务器上发布时,它显示 IIS 服务器错误有关这些错误代码的消息。

它显示这条消息:

显示此消息

代替:

而不是这个

我已经修改web.config<customErrors mode="Off" />

全球.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();
        }

错误控制器:

    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");
    }

我应该怎么做才能显示我的自定义错误消息?

4

2 回答 2

12

只需添加以下web.config配置即可通过 IIS 默认错误处理行为

<configuration>
    <system.webServer>
        <httpErrors existingResponse="PassThrough" />
    </system.webServer>
</configuration>
于 2014-10-19T07:02:03.540 回答
3

尝试使用

Response.TrySkipIisCustomErrors = true;

在您的控制器上。它比

<httpErrors existingResponse="PassThrough" />

因为这PassThrough可能会导致一些您并不总是期望的结果。例如在这里阅读如果模块没有设置任何文本,它将如何使自定义错误模块返回空白响应。

于 2017-04-05T19:41:24.033 回答