让我首先描述如何设置我的错误处理,因为在ASP.NET MVC中有几种方法可以执行此操作。我已经在web.config中配置了httpErrors,在控制器库中覆盖了HandleUnknownAction,并设置了一个处理未定义任何内容的路由,这样可以正常工作(例如,当找不到任何内容时显示我的404错误页面,当某些内容消失时显示我的500错误页面代码中的错误。)
的Web.config:
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<clear />
<error statusCode="400" path="/error/400" responseMode="ExecuteURL" />
<error statusCode="401" path="/error/401" responseMode="ExecuteURL" />
<error statusCode="402" path="/error/402" responseMode="ExecuteURL" />
<error statusCode="403" path="/error/403" responseMode="ExecuteURL" />
<error statusCode="404" path="/error/404" responseMode="ExecuteURL" />
<error statusCode="405" path="/error/405" responseMode="ExecuteURL" />
<error statusCode="406" path="/error/406" responseMode="ExecuteURL" />
<error statusCode="407" path="/error/407" responseMode="ExecuteURL" />
<error statusCode="408" path="/error/408" responseMode="ExecuteURL" />
<error statusCode="409" path="/error/409" responseMode="ExecuteURL" />
<error statusCode="410" path="/error/410" responseMode="ExecuteURL" />
<error statusCode="411" path="/error/411" responseMode="ExecuteURL" />
<error statusCode="412" path="/error/412" responseMode="ExecuteURL" />
<error statusCode="413" path="/error/413" responseMode="ExecuteURL" />
<error statusCode="414" path="/error/414" responseMode="ExecuteURL" />
<error statusCode="415" path="/error/415" responseMode="ExecuteURL" />
<error statusCode="416" path="/error/416" responseMode="ExecuteURL" />
<error statusCode="417" path="/error/417" responseMode="ExecuteURL" />
<error statusCode="429" path="/error/429" responseMode="ExecuteURL" />
<error statusCode="500" path="/error/500" responseMode="ExecuteURL" />
<error statusCode="501" path="/error/501" responseMode="ExecuteURL" />
<error statusCode="502" path="/error/502" responseMode="ExecuteURL" />
<error statusCode="503" path="/error/503" responseMode="ExecuteURL" />
<error statusCode="504" path="/error/504" responseMode="ExecuteURL" />
<error statusCode="505" path="/error/505" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
(我的自定义错误页面是一个路径为“error / {code}”的视图
控制器基础:
protected override void HandleUnknownAction(string actionName)
{
throw new HttpException(404, null);
}
RouteConfig:
routes.MapRoute("Undefined", "{*url}", new { controller = "Undefined", action = "Index" });
UndefinedController:
public class UndefinedController : Controller
{
public ActionResult Index()
{
throw new HttpException(404, null);
}
}
我还有一个HttpErrorResult(ActionResult)类可以正常返回任何错误:
public class HttpErrorResult : ActionResult
{
private int _code = 0;
public HttpErrorResult(int code)
{
_code = code;
}
public override void ExecuteResult(ControllerContext context)
{
throw new HttpException(_code, null);
}
}
好的,应该是我的错误处理中涉及的所有代码。
我遇到的问题是,当我从属性返回HttpErrorResult时,它不会显示我的自定义错误页面,而是标准的黄色错误页面,说“服务器错误在'/'应用程序”“类型'系统的例外。 Web.HttpException'被抛出。“
具体来说,当我尝试在EnforceRequestLimitAttribute(AuthorizeAttribute)类中返回429错误(请求太多)时,我遇到此问题:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!AuthorizeCore(filterContext.HttpContext))
filterContext.Result = new HttpErrorResult(429);
else
base.OnAuthorization(filterContext);
}
我无法理解这个的原因,因为在HandleUnknownAction方法和UndefinedController中抛出HttpException并在任何其他控制器中使用HttpErrorResult来获取自定义错误页面但在属性中它的行为有所不同。
为什么要这样做以及可以做些什么来解决它?
答案 0 :(得分:0)
我还没弄清楚原因,但只是设置Response.StatusCode而不是返回抛出HttpException的Result会产生预期效果,即显示自定义错误页面。
filterContext.HttpContext.Response.StatusCode = 429;
答案 1 :(得分:0)
对我来说,问题出在Global.asax.cs中。当我在“调试”模式下遇到异常时,我按F10键越过该异常并查看发生了什么。原来我在做
Server.ClearError();
这阻止了“自定义错误”页面的显示。删除此行可解决此问题。