예제 #1
0
 public AppException(ApiResultStatusCodeEnum statusCodeEnum, string?message, HttpStatusCode httpStatusCode, Exception?exception, object?additionalData)
     : base(message, exception)
 {
     ApiStatusCodeEnum = statusCodeEnum;
     HttpStatusCode    = httpStatusCode;
     AdditionalData    = additionalData;
 }
        public async System.Threading.Tasks.Task Invoke(HttpContext context)
        {
            string?                 message        = null;
            HttpStatusCode          httpStatusCode = HttpStatusCode.InternalServerError;
            ApiResultStatusCodeEnum apiStatusCode  = ApiResultStatusCodeEnum.ServerError;

            try
            {
                await _next(context);
            }
            catch (AppException exception)
            {
                _logger.LogError(exception, exception.Message);
                httpStatusCode = exception.HttpStatusCode;
                apiStatusCode  = exception.ApiStatusCodeEnum;

                if (_env.IsDevelopment())
                {
                    var dic = new Dictionary <string, string?>
                    {
                        ["Exception"]  = exception.Message,
                        ["StackTrace"] = exception.StackTrace,
                    };
                    if (exception.InnerException != null)
                    {
                        dic.Add("InnerException.Exception", exception.InnerException.Message);
                        dic.Add("InnerException.StackTrace", exception.InnerException.StackTrace);
                    }
                    if (exception.AdditionalData != null)
                    {
                        dic.Add("AdditionalData", JsonConvert.SerializeObject(exception.AdditionalData));
                    }

                    message = JsonConvert.SerializeObject(dic);
                }
                else
                {
                    message = exception.Message;
                }
                await WriteToResponseAsync();
            }
            catch (SecurityTokenExpiredException exception)
            {
                _logger.LogError(exception, exception.Message);
                SetUnAuthorizeResponse(exception);
                await WriteToResponseAsync();
            }
            catch (UnauthorizedAccessException exception)
            {
                _logger.LogError(exception, exception.Message);
                SetUnAuthorizeResponse(exception);
                await WriteToResponseAsync();
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, exception.Message);

                if (_env.IsDevelopment())
                {
                    var dic = new Dictionary <string, string?>
                    {
                        ["Exception"]  = exception.Message,
                        ["StackTrace"] = exception.StackTrace,
                    };
                    message = dic.SerializeToJson();
                }
                await WriteToResponseAsync();
            }

            async System.Threading.Tasks.Task WriteToResponseAsync()
            {
                if (context.Response.HasStarted)
                {
                    throw new InvalidOperationException("The response has already started, the http status code middleware will not be executed.");
                }

                var result = new ApiResult(false, apiStatusCode, message);
                var json   = JsonConvert.SerializeObject(result);

                context.Response.StatusCode  = (int)httpStatusCode;
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(json);
            }

            void SetUnAuthorizeResponse(Exception exception)
            {
                httpStatusCode = HttpStatusCode.Unauthorized;
                apiStatusCode  = ApiResultStatusCodeEnum.UnAuthorized;

                if (_env.IsDevelopment())
                {
                    var dic = new Dictionary <string, string?>
                    {
                        ["Exception"]  = exception.Message,
                        ["StackTrace"] = exception.StackTrace
                    };
                    if (exception is SecurityTokenExpiredException tokenException)
                    {
                        dic.Add("Expires", tokenException.Expires.ToString(CultureInfo.InvariantCulture));
                    }

                    message = JsonConvert.SerializeObject(dic);
                }
            }
        }
예제 #3
0
 public AppException(ApiResultStatusCodeEnum statusCodeEnum, string message, Exception exception, object additionalData)
     : this(statusCodeEnum, message, HttpStatusCode.InternalServerError, exception, additionalData)
 {
 }
예제 #4
0
 public AppException(ApiResultStatusCodeEnum statusCodeEnum, string?message, HttpStatusCode httpStatusCode, Exception?exception)
     : this(statusCodeEnum, message, httpStatusCode, exception, null)
 {
 }
예제 #5
0
 public AppException(ApiResultStatusCodeEnum statusCodeEnum, string message, Exception exception)
     : this(statusCodeEnum, message, HttpStatusCode.InternalServerError, exception)
 {
 }
예제 #6
0
 public AppException(ApiResultStatusCodeEnum statusCodeEnum, string?message, HttpStatusCode httpStatusCode, object additionalData)
     : this(statusCodeEnum, message, httpStatusCode, null, additionalData)
 {
 }
예제 #7
0
 public AppException(ApiResultStatusCodeEnum statusCodeEnum, object additionalData)
     : this(statusCodeEnum, null, additionalData)
 {
 }
예제 #8
0
 public AppException(ApiResultStatusCodeEnum statusCodeEnum)
     : this(statusCodeEnum, null)
 {
 }
예제 #9
0
 public ApiResult(bool isSuccess, ApiResultStatusCodeEnum customStatusCode, string?message = null)
 {
     IsSuccess        = isSuccess;
     CustomStatusCode = customStatusCode;
     Message          = message ?? customStatusCode.ToDisplayName() !;
 }