特定MVC 5控制器上的自定义错误

时间:2016-09-05 04:42:00

标签: c# asp.net asp.net-mvc asp.net-web-api error-handling

我遇到的问题是我只想为特定控制器显示自定义404和500个视图。

我想这样做的原因是我们在同一个项目中有APIControllers和标准控制器,我不想重写API错误响应。

我正在尝试使用继承HandleErrorAttribute的自定义属性来实现此目的,但我似乎无法通过它获得404。以下是我到目前为止OnException的内容:

public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            return;

        //Defaults to 500 if it cannot be determined
        int statusCode = new HttpException(null, filterContext.Exception).GetHttpCode();

        //We only want to capture 500 and 404 at this stage
        switch (statusCode)
        {
            case 404:
                View = _404ViewName;
                break;
            case 500:
                View = _500ViewName;
                break;
            default:
                return;
        }

        Master = _layoutViewName;

        string controllerName = (string)filterContext.RouteData.Values["controller"];
        string actionName = (string)filterContext.RouteData.Values["action"];

        HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
        ViewDataDictionary viewData = new ViewDataDictionary<HandleErrorInfo>(model);

        filterContext.Result = new ViewResult
        {
            ViewName = View,
            MasterName = Master,
            ViewData = viewData,
            TempData = filterContext.Controller.TempData
        };

        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = statusCode;

        // Certain versions of IIS will sometimes use their own error page when
        // they detect a server error. Setting this property indicates that we
        // want it to try to render ASP.NET MVC's error page instead.
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }

我之前在配置文件中尝试过这个:

<httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace">
  <remove statusCode="404"/>
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/404"/>
  <remove statusCode="500"/>
  <error statusCode="500" responseMode="ExecuteURL" path="/Error/500"/>
</httpErrors>

但是重写了API错误响应。

我目前只使用<customErrors mode="On" />代码,而且该代码适用于500个错误但我使用该代码获得404的通用IIS错误。

如果我将<httpErrors errorMode="Custom" existingResponse="PassThrough" />添加到网络配置中,500仍会显示我的自定义消息视图,但404现在只显示一个空白页。

我还需要做些什么才能让404s通过我的自定义属性?

或者如果这是不可能的,我可以采取哪种不同的方法,这不会影响API控制器?

0 个答案:

没有答案