コード例 #1
0
        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (context.Exception == null)
            {
                return;
            }

            int   code = 500;
            Error err  = new Error()
            {
                Message = "Internal server error.",
                Type    = "ServerError"
            };

            switch (context.Exception)
            {
            case ApiException apiEx:
                code        = apiEx.StatusCode;
                err.Message = apiEx.Message;
                err.Type    = ApiException.GetErrorType(apiEx.StatusCode);
                if (apiEx.StatusCode == 422)
                {
                    // Aggregate error messages in case of multiple validation errors
                    err.Reasons = new Dictionary <string, string>();
                    foreach (var key in context.ModelState.Keys)
                    {
                        err.Reasons.Add(key,
                                        context.ModelState.GetValueOrDefault(key)?.Errors
                                        .Select(e => e.ErrorMessage)
                                        .Aggregate((a, b) => a + "; " + b));
                    }
                }
                break;

            case DbUpdateException updateEx:
                switch ((updateEx.InnerException as SqliteException).SqliteErrorCode)
                {
                case 19:
                    int detailErr = (updateEx.InnerException as SqliteException).SqliteExtendedErrorCode;
                    switch (detailErr)
                    {
                    case 2067:
                        code        = 409;
                        err.Type    = ApiException.GetErrorType(409);
                        err.Message = "Record with DNS domain already exists.";
                        break;
                    }
                    break;

                default:
                    code        = 500;
                    err.Type    = "DatabaseError";
                    err.Message = "Internal database error.";
                    break;
                }
                break;
            }

            context.Result = new JsonResult(err)
            {
                StatusCode = code,
            };
            context.ExceptionHandled = true;
        }