How to handle errors in my CustomAutorize attribute in asp.net 3.0 Application

969 views Asked by At

I am working on an asp.net MVC 3.0 Application. I am using using my own CustomRoleProvider and CustomErrorHandler by overriding default attributes.

Every thing is working fine. But ,the problem is with the exception handling.

While testing the application , tester has given invalid DB connection to test.

The result is , Custom Error Handler is not rendering Error View , instead it is routing the original path

For ex:

I am running my application as

Home/Index

It is first hitting Custom Role Provider to fetch the roles for the application

Since , the Db Connection is not correct , it is raising exception that "Not able to Connect"

Now , Instead of routing to Error View along with this error message. It is routing to Home Controller and Index action.

**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 };
        }
    }

In the above code , after setting up filterContext.Result . It is not rendering Error View as Expected.

Please correct/suggest me, where i am going wrong..

Updated:

public class CustomRoleProvider : RoleProvider // Custom role provider { public override string[] GetRolesForUser(string username) {

          // Fetching roles for user from database 
    }

// Some other Methods

} This is method is generating exception , since it is trying to connect to wrong connection

Updated2:

1) I am using Custom Error Handler for the entire controller.

2) I need to catch all the exceptions including Ajax Errors

3) I have included my code for Custom Error Handler Above

4) I am also using CustomRole Provider for entire controller

5) Here, I am trying to generate exception , by giving wrong database connection

6) I am running the URL : Home/Index

7) Before going to thatr URL, it is hitting the methods in Role Provider class since i am using it as a attribute

8) Since, i have gave wrong DB Connection , It is generating exception

9) Then, it fires on exception method of Custom error handler

10) Building the Error Model for the error view

11) But, here is the problem. Instead of rendering Error View , it is going to index method of the Home Controller.

12) But, i need Error View to be rendered here, because it has failed to connect to database and getting roles . I want furthuer execution of URL Home/Index to be stopped here.

Hope this clarifies the problem..i am running in to. please feel free to ask me for furthuer details/Clarification

1

There are 1 answers

0
Oleg On BEST ANSWER

HandleError is designed to be able to register multiple filters (for example for different exceptions). One filter can handle only some specific exceptions or error cases and another unhandle cases can be handled by another HandleError. I suppose that currently both standard and your [CustomHandleError] filter are applied. You can set the Order property to an integer value that specifies a priority from -1 (highest priority) to any positive integer value. The greater the integer value is, the lower the priority of the filter is. You can use Order parameter for example (see here) to make your filter working before. More full description of the order you can find in the MSDN documentation.

The answer, this one and the article for example provide small examples of usage Order property of HandleError.