如何处理asp.net 3.0应用程序中的CustomAutorize属性中的错误

时间:2013-12-06 13:33:09

标签: asp.net-mvc exception-handling roleprovider

我正在开发一个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。

希望这能澄清问题..我正在跑步。请随时向我询问更多细节/澄清

1 个答案:

答案 0 :(得分:1)

HandleError旨在注册多个过滤器(例如针对不同的例外)。一个过滤器只能处理一些特定的异常或错误情况,另一个非处理案例可以由另一个HandleError处理。我想当前两个标准和你的[CustomHandleError]过滤器都已应用。您可以将Order属性设置为整数值,该值指定从-1(最高优先级)到任何正整数值的优先级。整数值越大,过滤器的优先级越低。例如,您可以使用Order参数(请参阅此处)使您的过滤器正常工作。您可以在the MSDN documentation找到更完整的订单说明。

例如,

The answerthis onethe article提供Order的使用HandleError属性的小示例。