160 lines
6.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|