.Net MVC自定义错误页面在IIS8中不起作用

时间:2013-10-21 19:08:03

标签: c# asp.net-mvc iis error-handling iis-8

我有一个.NET MVC应用程序,我在使用IIS 8的服务器上运行自定义错误页面时遇到问题。在我的应用程序中,我正在捕捉并正确地抛出异常并在我的错误页面上显示一条消息根据他们的违规行为进行定制。在调试中通过VS运行应用程序时以及在IIS(6.1)中的本地主机上配置站点时,这一切都在本地运行良好。

然后我将其部署到安装了IIS 8的服务器上。最初我收到了令人讨厌的默认500错误页面:default 500 error page http://img202.imageshack.us/img202/1352/b8gr.png

经过一些研究后,我发现我可以将以下内容添加到web.config中,至少会将我的友好错误页面给我,尽管没有自定义文本:

<system.webServer>
    <httpErrors errorMode="Detailed" />
</system.webServer>

我正在使用以下过滤器完成自定义错误消息:

public class GlobalExceptionFilter : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.HttpContext.IsCustomErrorEnabled && !filterContext.ExceptionHandled)
        {
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = 500;
            string controllerName = (string)filterContext.RouteData.Values["controller"];
            string actionName = (string)filterContext.RouteData.Values["action"];
            HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
            ErrorController newController = factory.CreateController(filterContext.RequestContext, "Error") as ErrorController;
            filterContext.RouteData.Values["controller"] = "Error";
            filterContext.Controller = newController;

            //Display specific error message for custom exception, otherwise generic message
            var model = new ErrorViewModel { Exception = info.Exception };
            if (info.Exception.GetType() == typeof(RchiveException) || info.Exception.GetType().IsSubclassOf(typeof(RchiveException)))
                model.Message = info.Exception.Message;
            else
                model.Message = "An error occurred processing your request.";
            filterContext.Controller.ViewData = new ViewDataDictionary(model);

            string actionToCall = "Index";
            if (filterContext.HttpContext.Request.IsAjaxRequest())
                actionToCall = "IndexAjax";

            filterContext.RouteData.Values["action"] = actionToCall;
            newController.ActionInvoker.InvokeAction(filterContext, actionToCall);
        }
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,实际上是通过将我的配置更改为:

来使其工作
<system.web>
    <customErrors mode="RemoteOnly">
      <error statusCode="404" redirect="/Error/E404" />
    </customErrors>
</system.web>

请将/ Error / E404更改为您的自定义错误路径。然后我还补充道:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" errorMode="Detailed"></httpErrors>
  </system.webServer>

我也通过Plesk进行了一些更改,但我相信httpErrors行最终会使它正常工作。