コード例 #1
0
        public virtual void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.IsChildAction ||
                (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled))
            {
                return;
            }

            var innerException = filterContext.Exception;

            if ((new HttpException(null, innerException).GetHttpCode() != 500) ||
                !ExceptionType.IsInstanceOfType(innerException))
            {
                return;
            }

            var result = new HttpStatusCodeResult(StatusCode);

            filterContext.Result           = result;
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode             = (int)StatusCode;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #2
0
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            bool breakLoop = false;
            int  tryCount  = 0;

            do
            {
                tryCount++;
                ActionExecutedContext actionExecutedContext = await next();

                if (actionExecutedContext.Exception != null && ExceptionType.IsInstanceOfType(actionExecutedContext.Exception) && tryCount < RetryCount)
                {
                    actionExecutedContext.Exception             = null;
                    actionExecutedContext.ExceptionDispatchInfo = null;
                    actionExecutedContext.Result   = null;
                    actionExecutedContext.Canceled = false;
                }
                else
                {
                    breakLoop = true;

                    if (actionExecutedContext.Result == null)
                    {
                        // TODO: Find a safer way to do this.
                        object result = typeof(ControllerActionInvoker).GetField("_result", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(next.Target);
                        actionExecutedContext.Result = (IActionResult)result;
                    }
                }
            } while (!breakLoop);
        }
コード例 #3
0
        public override void OnException(ExceptionContext context)
        {
            if (context.Exception == null)
            {
                context.ExceptionHandled = false;
                return;
            }

            if (!ExceptionType.IsInstanceOfType(context.Exception))
            {
                context.ExceptionHandled = false;
                return;
            }

            ErrorResponse errorResponse = new ErrorResponse();

            errorResponse.ErrorCode = Code;
            errorResponse.AddErrorMessage(Message);
            errorResponse.AdditionalInfo = context.Exception.Message;

            ObjectResult objectResult = new ObjectResult(errorResponse)
            {
                StatusCode = (int)StatusCode
            };

            context.ExceptionHandled = true;
            context.Result           = objectResult;

            _logger?.LogInformation($"Exception:{context.Exception.GetType()} is transfrormed.");
        }
コード例 #4
0
        /// <summary>
        /// to handling the error Exception details and displaying in UI
        /// </summary>
        /// <param name="filterContext"></param>
        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;
            }

            //Skip checked exception
            //if (filterContext.Exception is FaultException<ValidationFault>)
            //{
            //    return;
            //}

            // if the request is AJAX return JSON else view.
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error   = true,
                        message = filterContext.Exception.Message
                    }
                };
            }
            else
            {
                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
                };
            }

            // log the error using log4net.
            _logger.Error(filterContext.Exception.Message, filterContext.Exception);

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #5
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            Exception exception = filterContext.Exception;

            if (!ExceptionType.IsInstanceOfType(exception))
            {
                return;
            }

            string          controllerName = (string)filterContext.RouteData.Values["controller"];
            string          actionName     = (string)filterContext.RouteData.Values["action"];
            HandleErrorInfo model          = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

            filterContext.Result = new ViewResult
            {
                ViewName   = View,
                MasterName = Master,
                ViewData   = new ViewDataDictionary <HandleErrorInfo>(model),
                TempData   = filterContext.Controller.TempData
            };
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode             = new HttpException(null, exception).GetHttpCode();
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #6
0
        //private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        // Custom errors is set to ON, for demo purposes some error information will display in Views/Shared/Error.cshtml
        public override void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

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

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

            // This is where we would Log Errors
            // _log.Error("Internal server error occurred while handling web request.", filterContext.Exception);
        }
コード例 #7
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.IsChildAction)
            {
                return;
            }

            // If custom errors are disabled, we need to let the normal ASP.NET exception handler
            // execute so that the user can see useful debugging information.
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            var exception = filterContext.Exception;

            // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
            // ignore it.
            if (new HttpException(null, exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(exception))
            {
                return;
            }

            base.OnException(filterContext);

            exception.SendToAirbrake();
        }
コード例 #8
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            //Record Log
            //LogUtility.WebLogger.Error(
            //    string.Format("SenparcHandle错误。IP:{0}。页面:{1}",
            //        filterContext.HttpContext.Request.UserHostName,
            //        filterContext.HttpContext.Request.Url.PathAndQuery),
            //    filterContext.Exception);

            // If custom errors are disabled, we need to let the normal ASP.NET exception handler
            // execute so that the user can see useful debugging information.
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            Exception exception = filterContext.Exception;

            // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
            // ignore it.
            if (new HttpException(null, exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(exception))
            {
                return;
            }

            string             controllerName = (string)filterContext.RouteData.Values["controller"];
            string             actionName     = (string)filterContext.RouteData.Values["action"];
            ExceptionViewModel vd             = new ExceptionViewModel
            {
                HandleErrorInfo = new HandleErrorInfo(filterContext.Exception, controllerName, actionName)
            };

            filterContext.Result = new ViewResult
            {
                ViewName   = View,
                MasterName = Master,
                ViewData   = new ViewDataDictionary <ExceptionViewModel>(vd),
                TempData   = filterContext.Controller.TempData
            };
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            Logger.WebLogger.Error("500错误:" + exception.Message, exception);

            // Certain versions of IIS will sometimes use their own error page when
            // they detect a server error. Setting this property indicates that we
            // want it to try to render ASP.NET MVC's error page instead.
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
        public override void OnException(ExceptionContext filterContext)
        {
            // Handle only if CustomError is enabled and Exception is not handled elsewhere
            if (filterContext.HttpContext.IsCustomErrorEnabled &&
                !filterContext.ExceptionHandled)
            {
                // TODO : Currently only handles 500 type exception. Need new strategy to handle other types (may be through Applicaton_Error event)
                var isStatus500 = new HttpException(null, filterContext.Exception).GetHttpCode() == 500;

                // Handle only StatusCode = 500 error. Other errors will be reported according to CustomError redirects
                if (isStatus500 &&
                    ExceptionType.IsInstanceOfType(filterContext.Exception))
                {
                    LogError(filterContext);

                    EvaluateErrorResult(filterContext);

                    FinalTouch(filterContext);
                }
            }
            else
            {
                base.OnException(filterContext);
            }
        }
コード例 #10
0
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled)
        {
            return;
        }
        if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
        {
            return;
        }
        if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
        {
            return;
        }

        string          controllerName = filterContext.GetController();
        string          actionName     = filterContext.GetAction();
        HandleErrorInfo model          = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

        filterContext.Result = new ViewResult
        {
            ViewName   = View,
            MasterName = Master,
            ViewData   = new ViewDataDictionary <HandleErrorInfo>(model)
        };

        //使用log4net写入本地日志
        _logger.Error(filterContext.Exception.Message, filterContext.Exception);

        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode             = 500;
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        filterContext.ExceptionHandled = true;
    }
コード例 #11
0
        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;
            }

            //Determine the return type of the action
            var  controllerName = (string)filterContext.RouteData.Values["controller"];
            var  actionName     = (string)filterContext.RouteData.Values["action"];
            Type controllerType = filterContext.Controller.GetType();
            var  method         = controllerType.GetMethod(actionName);
            var  returnType     = method.ReturnType;

            //If the action that generated the exception returns JSON
            if (returnType.Equals(typeof(JsonResult)))
            {
                filterContext.Result = new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        success = false,
                        message = filterContext.Exception.Message,
                        data    = "",
                    }
                };
            }
            else
            {
                var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

                filterContext.Result = new ViewResult
                {
                    ViewName   = "Error/Index.cshtml",
                    MasterName = Master,
                    ViewData   = new ViewDataDictionary <HandleErrorInfo>(model),
                    TempData   = filterContext.Controller.TempData
                };
            }

            SfLogger.Instance.LogException(filterContext.Exception);

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #12
0
        /// <summary>
        /// Custom HandleErrorAttribute to return exceptions in controllers.
        ///
        /// If the request in an Ajax request, respond with a JSON message.
        /// Otherwise respond with a ViewResult.
        /// </summary>
        /// <param name="filterContext">Context of the exception</param>
        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 (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var title   = string.Empty;
                var message = filterContext.Exception.Message;

                if (filterContext.Exception is ImageFetchException)
                {
                    title = ((ImageFetchException)filterContext.Exception).Title;
                }

                filterContext.Result = new JsonNetResult(new
                {
                    Error = true,
                    Title = !string.IsNullOrWhiteSpace(title)
                        ? title
                        : "Error",
                    Message = !string.IsNullOrWhiteSpace(message)
                        ? message
                        : "An error has occurred"
                });
            }
            else
            {
                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
                };
            }

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #13
0
        public override void OnException(ExceptionContext filterContext)
        {
            //base.OnException(filterContext);
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }
            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                return;
            }
            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            //如果是AJAX请求返回json
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                //filterContext.Result = new JsonResult()
                //{
                //    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                //    Data = new
                //    {
                //        error = true,
                //        message = filterContext.Exception.Message
                //    }
                //};
                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(model),
                    TempData   = filterContext.Controller.TempData
                };
            }
            else
            {
                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(model),
                    TempData   = filterContext.Controller.TempData
                };
            }
            LoggerHelper.Error(filterContext.Exception.Message, filterContext.Exception);
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode             = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #14
0
        public void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.IsChildAction ||
                (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled))
            {
                return;
            }
            var innerException = filterContext.Exception;

            // if the request is AJAX return JSON else view.
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error   = true,
                        message = filterContext.Exception.Message
                    }
                };
            }
            else
            {
                // adding the internal server error (500 status http code)
                if ((new HttpException(null, innerException).GetHttpCode() != 500) ||
                    !ExceptionType.IsInstanceOfType(innerException))
                {
                    return;
                }
                var controllerName = (string)filterContext.RouteData.Values["controller"];
                var actionName     = (string)filterContext.RouteData.Values["action"];
                var model          = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

                // checking for Ajax request
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    var result = new PartialViewResult
                    {
                        ViewName = string.IsNullOrEmpty(View) ? DefaultAjaxView : View,
                        ViewData = new ViewDataDictionary <HandleErrorInfo>(model),
                        TempData = filterContext.Controller.TempData
                    };
                    filterContext.Result = result;
                }
                else
                {
                    var result = CreateActionResult(filterContext, model);
                    filterContext.Result = result;
                }
            }
            filterContext.ExceptionHandled = true;
        }
コード例 #15
0
        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 = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error   = true,
                        message = filterContext.Exception.Message
                    }
                };
            }
            else
            {
                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(model),
                    TempData   = filterContext.Controller.TempData
                };
            }

            // log the error by using your own method
            var logger = new CommonHelper.Logger();

            logger.WriteLog(CommonHelper.MessageType.Exception.ToString(), filterContext.Exception.Message.ToString(), View.ToString(), filterContext.Controller.ToString(), HttpContext.Current.User.Identity.Name.ToString());
            logger = null;

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #16
0
        /// <summary>
        ///     Called when an exception occurs.
        /// </summary>
        /// <param name="exceptionContext">The exception context.</param>
        public override void OnException(ExceptionContext exceptionContext)
        {
            if (exceptionContext.ExceptionHandled /* || !exceptionContext.HttpContext.IsCustomErrorEnabled*/)
            {
                return;
            }

            if (new HttpException(null, exceptionContext.Exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(exceptionContext.Exception))
            {
                return;
            }

            // if the request is AJAX return JSON else view. // http://stackoverflow.com/questions/4707755/asp-net-mvc-ajax-error-handling
            if (exceptionContext.HttpContext.Request.IsAjaxRequest() && exceptionContext.Exception != null)
            {
                exceptionContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error   = true,
                        message = exceptionContext.Exception.Message,

                        // todo: replace the message with more general message like http://stackoverflow.com/questions/9120002/jquery-ajax-error-handling
                        //stackTrace = exceptionContext.Exception.StackTrace
                    }
                };
                exceptionContext.ExceptionHandled = true;
            }
            else
            {
                var controllerName = (string)exceptionContext.RouteData.Values["controller"];
                var actionName     = (string)exceptionContext.RouteData.Values["action"];
                var model          = new HandleErrorInfo(exceptionContext.Exception, controllerName, actionName);

                exceptionContext.Result = new ViewResult
                {
                    ViewName   = View,
                    MasterName = Master,
                    ViewData   = new ViewDataDictionary <HandleErrorInfo> (model),
                    TempData   = exceptionContext.Controller.TempData
                };
            }

            _logger.Fatal(exceptionContext.Exception.Message, exceptionContext.Exception);

            exceptionContext.ExceptionHandled = true;
            exceptionContext.HttpContext.Response.Clear();
            exceptionContext.HttpContext.Response.StatusCode = 500;

            exceptionContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #17
0
        public override void OnException(ExceptionContext filterContext)
        {
            //base.OnException(filterContext);

            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }
            if (filterContext.IsChildAction)
            {
                return;
            }

            // If custom errors are disabled, we need to let the normal ASP.NET exception handler
            // execute so that the user can see useful debugging information.
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            Exception exception = filterContext.Exception;

            // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
            // ignore it.
            if (new HttpException(null, exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(exception))
            {
                return;
            }

            string          controllerName = (string)filterContext.RouteData.Values["controller"];
            string          actionName     = (string)filterContext.RouteData.Values["action"];
            HandleErrorInfo model          = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

            filterContext.Result = new ViewResult
            {
                ViewName   = View,
                MasterName = Master,
                ViewData   = new ViewDataDictionary <HandleErrorInfo>(model),
                TempData   = filterContext.Controller.TempData
            };
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            // Certain versions of IIS will sometimes use their own error page when
            // they detect a server error. Setting this property indicates that we
            // want it to try to render ASP.NET MVC's error page instead.
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            //filterContext.HttpContext.Response.AddHeader(CustomHttpHeader.ErrorHandled, "true");
            //to log the error
            logger.HandleException(model.Exception, "DongboErrorHandler.ExceptionFilter");
        }
コード例 #18
0
        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 request is AJAX Call from client to server silde return Json view
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error   = true,
                        message = filterContext.Exception.Message
                    }
                };
            }
            else
            {
                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
                };
            }

            // Log Error using log4net
            var stackTree = new StackTrace(filterContext.Exception, true);
            //Get the stop stack Frame
            var frame = stackTree.GetFrame(stackTree.FrameCount - 1);
            var line  = frame.GetFileLineNumber();

            _logger.Error(filterContext.Exception.Message + "line:" + line, filterContext.Exception);
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            base.OnException(filterContext);
        }
コード例 #19
0
        /// <summary>
        /// Called when an exception occurs.
        /// </summary>
        /// <param name="context">The exception context.</param>
        public override void OnException(ExceptionContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            //If exception handled before, do nothing.
            //If this is child action, exception should be handled by main action.
            if (context.ExceptionHandled || context.IsChildAction)
            {
                return;
            }

            //Always log exception
            LogHelper.LogException(Logger, context.Exception);

            // If custom errors are disabled, we need to let the normal ASP.NET exception handler
            // execute so that the user can see useful debugging information.
            if (!context.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
            // ignore it.
            if (new HttpException(null, context.Exception).GetHttpCode() != 500)
            {
                return;
            }

            //Do not handle exceptions for attributes configured for special exception types and this exceptiod does not fit condition.
            if (!ExceptionType.IsInstanceOfType(context.Exception))
            {
                return;
            }

            //We handled the exception!


            // 判断是否ajax请求

            context.Result = IsAjaxRequest(context)
                ? GenerateAjaxResult(context)
                : GenerateNonAjaxResult(context);
            context.HttpContext.Response.Clear();
            context.ExceptionHandled = true;
            // Certain versions of IIS will sometimes use their own error page when
            // they detect a server error. Setting this property indicates that we
            // want it to try to render ASP.NET MVC's error page instead.
            // context.HttpContext.Response.TrySkipIisCustomErrors = true;
            context.HttpContext.Response.TrySkipIisCustomErrors = true;
            //Trigger an event, so we can register it.
            EventBus.Trigger(new EddoHandledExceptionData(context.Exception));
        }
コード例 #20
0
        /// <summary>
        /// Called when an exception occurs.
        /// </summary>
        /// <param name="filterContext">The action-filter context.</param>
        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. //http://stackoverflow.com/questions/4707755/asp-net-mvc-ajax-error-handling
            if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)//(filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error      = true,
                        message    = filterContext.Exception.Message,
                        stackTrace = filterContext.Exception.StackTrace
                    }
                };
                filterContext.ExceptionHandled = true;
            }
            else
            {
                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
                };
            }

            logger.Error(filterContext.Exception.Message, filterContext.Exception);

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #21
0
        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 (IsAjax(filterContext))
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error   = true,
                        message = filterContext.Exception.Message
                    }
                };
            }
            else
            {
                var controllerName = (string)filterContext.RouteData.Values["controller"];
                var actionName     = (string)filterContext.RouteData.Values["action"];
                var model          = new SecurityPortalErrorInfo(filterContext.Exception, controllerName, actionName);
                model.ErrorId = String.Empty;

                filterContext.Result = new ViewResult
                {
                    ViewName   = View,
                    MasterName = Master,
                    ViewData   = new ViewDataDictionary <HandleErrorInfo>(model),
                    TempData   = filterContext.Controller.TempData
                };
            }

            // log the error using log4net.
            //_logger.Error(filterContext.Exception.Message, filterContext.Exception);

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #22
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled)//Exception daha önceden handle edilmişse
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            // İstek AJAX ile gelmişse JSON döndür
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                int httpCode = new HttpException(null, filterContext.Exception).GetHttpCode();

                filterContext.HttpContext.Response.StatusCode = 500;
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new ExecuteResult
                    {
                        Succeeded     = false,
                        ResultMessage = filterContext.Exception.Message
                    }
                };
            }
            // log the error using log4net.
            Context.Logger.Error(filterContext.Exception.Message, filterContext.Exception);

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

            //İstek ajax değilse view döndür
            if (!filterContext.HttpContext.Request.IsAjaxRequest())
            {
                int httpCode = new HttpException(null, filterContext.Exception).GetHttpCode();
                switch (httpCode)
                {
                case 401:
                    filterContext.Controller.TempData["AppError"] = "Sayfaya erişim yetkiniz yoktur";
                    filterContext.HttpContext.Response.Redirect("~/Error/AuthorizationError");
                    break;

                default:
                    filterContext.Controller.TempData["AppError"] = "Şu anda işleminiz gerçekleştirilememektedir.Lütfen daha sonra tekrar deneyin.";
                    filterContext.HttpContext.Response.Redirect("~/Error/Index");
                    break;
                }
            }
        }
コード例 #23
0
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);

            Log log = LogFactory.GetLogger(filterContext.Exception.Source);

            log.Error(filterContext.Exception.Message);

            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error   = true,
                        message = filterContext.Exception.Message
                    }
                };
            }
            else
            {
                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(model),
                    TempData   = filterContext.Controller.TempData
                };
            }

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode             = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
コード例 #24
0
        //private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        public override void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            if (filterContext.Exception is HttpAntiForgeryException)
            {
                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
                string afgMessage = "Invalid post from URL" + filterContext.HttpContext.Request.Url.ToString();
                Logger.LogError("USAS - Antiforgery Error", afgMessage);
                return;
            }

            if (filterContext.Exception is HttpRequestValidationException)
            {
                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
                string xssMessage = "Invalid request sent: " + filterContext.Exception.Message;
                Logger.LogError("USAS - XSS Error", xssMessage);
                return;
            }

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

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

            string errMsg = "Error in Controller: " + controllerName + " Action: " + actionName + " Error: " + model.Exception.Message;

            Logger.LogError("USAS - Unhandled Error", errMsg);
        }
コード例 #25
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }
            if (filterContext.IsChildAction)
            {
                return;
            }

            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            Exception exception = filterContext.Exception;

            if (new HttpException(null, exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(exception))
            {
                return;
            }

            var guid           = GuidHelper.GenerateGuid();
            var controllerName = (string)filterContext.RouteData.Values["controller"];
            var actionName     = (string)filterContext.RouteData.Values["action"];
            var model          = new HandleErrorInfoLogged(filterContext.Exception, controllerName, actionName, guid);

            filterContext.Result = new ViewResult
            {
                ViewName   = View,
                MasterName = Master,
                ViewData   = new ViewDataDictionary <HandleErrorInfoLogged>(model),
                TempData   = filterContext.Controller.TempData
            };

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

            var logger = UnityConfig.GetLogger();

            logger.Error($"Identifiant de l'erreur : {guid}", filterContext.Exception);
        }
コード例 #26
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled)
            {
                return;
            }

            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            h_excepcion excepcion = new h_excepcion();

            excepcion.fe_excepcion = DateTime.Now;
            excepcion.ds_excepcion = filterContext.Exception.Message;
            excepcion.nb_metodo    = filterContext.Controller.ControllerContext.RouteData.Values["action"].ToString();

            var    aux     = filterContext.Controller.GetType().GetCustomAttributesData();
            string funcion = "";

            foreach (var attribute in aux)
            {
                //if (attribute.AttributeType.Name == "OverloadAvoiderAttribute") return;

                if (attribute.AttributeType.Name == "AccessAttribute")
                {
                    funcion = (string)attribute.NamedArguments[0].TypedValue.Value;
                    if (funcion == null)
                    {
                        //Regresar una vista con buena presentacion con los datos del error
                        return;
                    }
                    break;
                }
            }
            excepcion.id_funcion = utilidades.IdFuncion(funcion);

            db.h_excepcion.Add(excepcion);
            db.SaveChanges();

            //Regresar una vista con buena presentacion con los datos del error
            return;
        }
コード例 #27
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                Func <Exception, object> getGlobalError = null;

                getGlobalError = e =>
                {
                    if (e == null)
                    {
                        return(null);
                    }

                    var globalError = new
                    {
                        ErrorMessage   = e.Message,
                        StackTrace     = e.StackTrace,
                        InnerException = getGlobalError(e.InnerException)
                    };

                    return(globalError);
                };

                var data = getGlobalError(filterContext.Exception);

                filterContext.Result = new JsonResult
                {
                    Data                = data,
                    ContentType         = "text/html",
                    ContentEncoding     = System.Text.Encoding.UTF8,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };

                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
                filterContext.HttpContext.Response.StatusCode = 500;

                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            }
            else
            {
                base.OnException(filterContext);
            }
        }
コード例 #28
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext is null");
            }

            // If custom errors are disabled, we need to let the normal ASP.NET exception handler
            // execute so that the user can see useful debugging information.
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            //status !=500 return
            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                return;
            }

            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            string controllerName = (string)filterContext.RouteData.Values["controller"];
            string 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
            };

            log.WriteExceptionLog(filterContext.Exception.StackTrace);
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = new HttpException(null, filterContext.Exception).GetHttpCode();

            // Certain versions of IIS will sometimes use their own error page when
            // they detect a server error. Setting this property indicates that we
            // want it to try to render ASP.NET MVC's error page instead.
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = false;
        }
コード例 #29
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled)
            {
                return;                                 // || !filterContext.HttpContext.IsCustomErrorEnabled
            }
            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                filterContext.HttpContext.Response.Redirect(String.Format("~/Error/Application"));
            }

            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                filterContext.HttpContext.Response.Redirect(String.Format("~/Error/Application"));
            }

            // if the request is AJAX return JSON else view.
            if (IsAjaxRequest(filterContext))
            {
                // return Json to client as it is a ajax request
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        action     = "redirect",
                        controller = "error",
                        page       = "application"
                    }
                };

                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
            }
            else
            {
                // Normal Exception
                base.OnException(filterContext);
            }

            // TODO: Write error logging code ...

            //if want to get to the source of the request
            //var currentController = (string)filterContext.RouteData.Values["controller"];
            //var currentActionName = (string)filterContext.RouteData.Values["action"];
        }
コード例 #30
0
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled || !ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            var redirectTarget = new RouteValueDictionary
            {
                { "action", Action },
                { "controller", Controller }
            };

            filterContext.Result = new RedirectToRouteResult(redirectTarget);

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
        }