我遇到的问题是我只想为特定控制器显示自定义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控制器?