using System; using System.Linq; using System.Net; using System.Web.Mvc; using System.Web.Routing; using Kreta.Core.Validation.Exceptions; using Kreta.Enums.ManualEnums; using Kreta.Framework; using Kreta.Web.Helpers.Error; using Kreta.Web.Logging.Extensions; using Kreta.Web.Logging.Logger; namespace Kreta.Web { public class MvcCustomExceptionAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { Guid? logId = null; if (filterContext.HttpContext.Request.Headers.AllKeys.Contains(KliensTipusEnum.Mobile.ToString())) { if (filterContext.Exception is System.Web.Http.HttpResponseException exception) { filterContext.Result = new HttpStatusCodeResult((int)exception.Response.StatusCode); } else { filterContext.Result = new HttpStatusCodeResult((int)CustomHTTPStatusEnum.KezeletlenHiba); } } else { var statusError = filterContext.Exception as StatusError; var validationError = filterContext.Exception as ValidationException; if (statusError != null) { filterContext.HttpContext.Response.StatusCode = statusError.StatusCode; #if !DEBUG if (statusError.UnHandledException != null) { logId = SDAServer.Instance.Logger.ExceptionThrown(statusError.UnHandledException, filterContext.HttpContext.Request.UserHostAddress); } #endif if (statusError.Redirect != null) { filterContext.Result = new RedirectToRouteResult(statusError.Redirect); } else { filterContext.Result = new JsonResult { ContentType = "application/json", Data = new ErrorModel { Message = statusError.Message, Json = statusError.Json, Status = statusError.StatusCode, IsMvc = true, ErrorCode = logId }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } } else if (validationError != null) { filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest; filterContext.Result = new JsonResult { ContentType = "application/json", Data = new ErrorModel { Message = validationError.Message, Json = string.Empty, Status = (int)HttpStatusCode.BadRequest, IsMvc = true, ErrorCode = logId }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } else { #if !DEBUG logId = SDAServer.Instance.Logger.ExceptionThrown(filterContext.Exception, filterContext.HttpContext.Request.UserHostAddress); #endif if (filterContext.HttpContext.Request.IsAjaxRequest() || filterContext.HttpContext.Request.Files.Count > 0)/*a kendo file upload egy iframet postol és ajaxosan kezeli le ami megtréfálja a logikát*/ { filterContext.Result = new JsonResult { ContentType = "application/json", Data = new ErrorModel { IsStatusError = false, Message = StringResourcesUtil.GetString(45)/*Hiba történt az oldalon*/, Status = (int)HttpStatusCode.InternalServerError, IsMvc = true, ErrorCode = logId }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } else { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "HibaOldal", action = "Index", area = string.Empty })); } filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; } } filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; if (!filterContext.Exception.Data.Contains(RequestResponseLoggingFields.Server.ExceptionId)) { filterContext.Exception.Data.Add(RequestResponseLoggingFields.Server.ExceptionId, logId); } filterContext.HttpContext.ApplicationInstance.Context.AddException(filterContext.Exception); } protected virtual ActionResult CreateActionResult(ExceptionContext filterContext) { var ctx = new ControllerContext(filterContext.RequestContext, filterContext.Controller); var viewName = SelectFirstView(ctx, "~/Views/ErrorHandler/CustomError.cshtml"); var controllerName = (string)filterContext.RouteData.Values["controller"]; var actionName = (string)filterContext.RouteData.Values["action"]; var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); var result = new PartialViewResult { ViewName = viewName, ViewData = new ViewDataDictionary(model), }; return result; } protected string SelectFirstView(ControllerContext ctx, params string[] viewNames) { return viewNames.First(view => ViewExists(ctx, view)); } protected bool ViewExists(ControllerContext ctx, string name) { var result = ViewEngines.Engines.FindView(ctx, name, null); return result.View != null; } } }