kreta/KretaWeb/App_Start/MvcCustomExceptionAttribute.cs
2024-03-13 00:33:46 +01:00

160 lines
6.7 KiB
C#

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