我正在开发一个 asp.net MVC 3.0 应用程序。我正在使用我自己的 CustomRoleProvider
和 CustomErrorHandler 通过覆盖默认属性。
一切都运转良好。但是,问题出在异常处理上。
在测试应用程序时,测试人员给出了无效的数据库连接来测试。
结果是,自定义错误处理程序没有渲染错误视图,而是路由原始路径
For ex:
我正在运行我的应用程序
Home/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之后。它没有按预期呈现错误视图。
请纠正/建议我,我哪里出错了..
Updated:
public class CustomRoleProvider : RoleProvider // 自定义角色提供者
{
公共覆盖字符串[] GetRolesForUser(字符串用户名)
{
// Fetching roles for user from database
}
// 其他一些方法
}
该方法正在生成异常,因为它正在尝试连接到错误的连接
更新2:
1)我对整个控制器使用自定义错误处理程序。
2)我需要捕获所有异常,包括Ajax错误
3)我已经在上面包含了自定义错误处理程序的代码
4)我还在整个控制器中使用 CustomRole Provider
5)在这里,我试图通过给出错误的数据库连接来生成异常
6)我正在运行 URL:Home/Index
7) 在访问该 URL 之前,它会调用 Role Provider 类中的方法,因为我将其用作属性
8)由于我给出了错误的数据库连接,它正在生成异常
9) 然后,它触发自定义错误处理程序的异常方法
10) 为错误视图构建错误模型
11) 但是,问题就在这里。它不会渲染 Error View ,而是会索引 Home Controller 的方法。
12)但是,我需要在此处呈现错误视图,因为它无法连接到数据库并获取角色。我希望进一步执行 URL Home/Index 在此停止。
希望这能澄清问题……我正在遇到。请随时向我询问更多详细信息/澄清