我正在开发一个asp.net MVC 3.0应用程序。我正在使用我自己的CustomRoleProvider 和CustomErrorHandler通过覆盖默认属性。
每件事都很好。但是,问题在于异常处理。
在测试应用程序时,测试人员给出了无效的数据库连接以进行测试。
结果是,自定义错误处理程序不呈现错误视图,而是路由原始路径
例如:
我正在运行我的应用程序
Home/Index
首先点击自定义角色提供程序来获取应用程序的角色
由于Db连接不正确,因此引发了“无法连接”的异常
现在,而不是路由到错误视图以及此错误消息。它将路由到Home Controller和Index操作。
**The code for my Custom Error Handler is as Follows**
public class CustomHandleErrorAttribute : HandleErrorAttribute // Error handler
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
{
return;
}
if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
{
return;
}
if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
{
return;
}
// if the request is AJAX return JSON else view.
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
filterContext.Result = AjaxError(filterContext.Exception.Message, filterContext);
}
else
{
filterContext.ExceptionHandled = true;
var controllerName = (string)filterContext.RouteData.Values["controller"];
var actionName = (string)filterContext.RouteData.Values["action"];
var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult
{
ViewName = View,
MasterName = Master,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
}
}
protected JsonResult AjaxError(string message, ExceptionContext filterContext)
{
if (String.IsNullOrEmpty(message))
message = "Something went wrong while processing your request. Please refresh the page and try again.";
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
return new JsonResult { Data = new { ErrorMessage = message }, ContentEncoding = System.Text.Encoding.UTF8, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
}
在上面的代码中,设置了filterContext.Result。它不会将错误视图呈现为预期。
请纠正/建议我,我哪里出错..
更新
公共类CustomRoleProvider:RoleProvider //自定义角色提供程序 { public override string [] GetRolesForUser(string username) {
// Fetching roles for user from database
}
//其他一些方法
} 这种方法正在生成异常,因为它正在尝试连接到错误的连接
Updated2:
1)我正在为整个控制器使用自定义错误处理程序。
2)我需要捕获所有异常,包括Ajax错误
3)我已将自定义错误处理程序的代码包含在上面
4)我也在为整个控制器使用CustomRole Provider
5)在这里,我试图通过提供错误的数据库连接来生成异常
6)我正在运行URL:Home / Index
7)在转到thatr URL之前,它正在使用Role Provider类中的方法,因为我将它用作属性
8)因为,我提供了错误的数据库连接,它正在生成异常
9)然后,它触发自定义错误处理程序的异常方法
10)为错误视图构建错误模型
11)但是,这是问题所在。它不是渲染错误视图,而是索引Home Controller的方法。
12)但是,我需要在此处呈现错误视图,因为它无法连接到数据库并获取角色。我希望在这里停止更快地执行URL Home / Index。
希望这能澄清问题..我正在跑步。请随时向我询问更多细节/澄清
答案 0 :(得分:1)
HandleError
旨在注册多个过滤器(例如针对不同的例外)。一个过滤器只能处理一些特定的异常或错误情况,另一个非处理案例可以由另一个HandleError
处理。我想当前两个标准和你的[CustomHandleError]
过滤器都已应用。您可以将Order
属性设置为整数值,该值指定从-1(最高优先级)到任何正整数值的优先级。整数值越大,过滤器的优先级越低。例如,您可以使用Order参数(请参阅此处)使您的过滤器正常工作。您可以在the MSDN documentation找到更完整的订单说明。
The answer,this one和the article提供Order
的使用HandleError
属性的小示例。