示例#1
0
        public override void OnResultExecuting(ResultExecutingContext context)
        {
            if (!(context.Result is JsonResult))
            {
                var response = new H_Response
                {
                    Success = true,
                    Data    = context.Result is EmptyResult ? null : (context.Result as ObjectResult)?.Value
                };

                context.Result = new JsonResult(response);
            }

            base.OnResultExecuting(context);
        }
 internal static IServiceCollection AddValidateModelService(this IServiceCollection services)
 {
     services.Configure <ApiBehaviorOptions>(options =>
     {
         options.InvalidModelStateResponseFactory = (context) =>
         {
             var error    = context.ModelState.Values.SelectMany(x => x.Errors.Select(p => p.ErrorMessage)).FirstOrDefault();
             var response = new H_Response
             {
                 Success  = false,
                 ErrorMsg = error
             };
             return(new JsonResult(response));
         };
     });
     return(services);
 }
        //静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

        //静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
        /// <summary>
        /// 异常处理,不会处理eventbus中的异常
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private static async Task Invoke(HttpContext context)
        {
            context.Response.StatusCode  = StatusCodes.Status200OK;
            context.Response.ContentType = "application/json";

            var response = new H_Response {
                Success = false
            };

            var ex = context.Features.Get <IExceptionHandlerFeature>().Error;

            if (ex is H_Exception exception)
            {
                response.ErrorCode = exception.Code;
                response.ErrorMsg  = exception.Message;
            }
            else if (ex is AspectInvocationException aspectException)
            {
                response.ErrorMsg = aspectException.InnerException?.Message;
            }
#if DEBUG  //开发环境 能看具体错误
            else
            {
                response.ErrorMsg = ex.Message;
            }
#endif
            if (string.IsNullOrWhiteSpace(response.ErrorMsg))
            {
                response.ErrorMsg = "系统异常";
            }

            H_Log.Error(ex, new LogNote()
            {
                Location = context.Request.Path.Value,
                TraceId  = context.TraceIdentifier,
                Extra    = "系统异常信息"
            }); //异常信息,记录到日志中

            var options = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, //解决中文乱码
                PropertyNamingPolicy = null                            //PropertyNamingPolicy = JsonNamingPolicy.CamelCase //开头字母小写 默认
            };

            await context.Response.WriteAsync(JsonSerializer.Serialize(response, options), Encoding.UTF8);
        }
        ///// <summary>
        ///// 接收时
        ///// </summary>
        ///// <param name="context"></param>
        ///// <returns></returns>
        //public override Task MessageReceived(MessageReceivedContext context)
        //{
        //    context.Token = context.Request.Headers["Authorization"];
        //    return Task.CompletedTask;
        //}

        ///// <summary>
        ///// TokenValidated:在Token验证通过后调用。
        ///// </summary>
        ///// <param name="context"></param>
        ///// <returns></returns>
        //public override Task TokenValidated(TokenValidatedContext context)
        //{

        //    return Task.CompletedTask;
        //}
        #endregion


        /**注释原因:token过期AuthenticationFailed执行完后 Challenge方法会报System.InvalidOperationException: StatusCode cannot be set because the response has already started**/
        ///// <summary>
        ///// AuthenticationFailed: 认证失败时调用。触发场景:1.token过期(一定)  使用时一定要在 Controller或方法名上加[Authorize]
        ///// </summary>
        ///// <param name="context"></param>
        ///// <returns></returns>
        //public override async Task AuthenticationFailed(AuthenticationFailedContext context)
        //{
        //    context.Response.StatusCode = StatusCodes.Status200OK;
        //    context.Response.ContentType = "application/json";
        //    var response = new HResponse()
        //    {
        //        Success = false,
        //        ErrorCode = nameof(ErrorInfo.E100001).GetErrorCode(),
        //        ErrorMsg = ErrorInfo.E100001
        //    };
        //    await context.Response.WriteAsync(H_JsonSerializer.Serialize(response));
        //}


        /// <summary>
        /// Challenge: 服务器可以用来针对客户端的请求发送质询(challenge)。 触发场景:1.token值为空(一定) 2.token过期(一定) 2.token值有误 (一定)。 使用时一定要在 Controller或方法名上加[Authorize]
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override async Task Challenge(JwtBearerChallengeContext context)
        {
            context.HandleResponse(); //此处代码为终止.Net Core默认的返回类型和数据结果,这个很重要哦,必须,不加的话 控制台里会报异常System.InvalidOperationException: StatusCode cannot be set because the response has already started
            context.Response.StatusCode  = StatusCodes.Status200OK;
            context.Response.ContentType = "application/json";
            var response = new H_Response()
            {
                Success   = false,
                ErrorCode = H_Error.E100001.Key,
                ErrorMsg  = H_Error.E100001.Value
            };

            var options = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, //解决中文乱码
                PropertyNamingPolicy = null                            //PropertyNamingPolicy = JsonNamingPolicy.CamelCase //开头字母小写 默认
            };

            await context.Response.WriteAsync(JsonSerializer.Serialize(response, options));
        }
        /// <summary>
        /// 异常处理,不会处理eventbus中的异常
        /// </summary>
        /// <param name="context"></param>
        public override void OnException(ExceptionContext context)
        {
            var ex = context.Exception;

            var response = new H_Response {
                Success = false
            };

            if (ex is H_Exception exception)
            {
                response.ErrorCode = exception.Code;
                response.ErrorMsg  = exception.Message;
            }
            else if (ex is AspectInvocationException aspectException)
            {
                response.ErrorMsg = aspectException.InnerException?.Message;
            }
#if DEBUG  //开发环境 能看具体错误
            else
            {
                response.ErrorMsg = ex.Message;
            }
#endif


            if (string.IsNullOrWhiteSpace(response.ErrorMsg))
            {
                response.ErrorMsg = "系统异常";
            }

            context.Result = new JsonResult(response);

            H_Log.Error(ex, new LogNote()
            {
                Location = context.HttpContext.Request.Path.Value,
                TraceId  = context.HttpContext.TraceIdentifier,
                Extra    = "系统异常信息"
            });                        //异常信息,记录到日志中

            base.OnException(context); //返回结果 不会经过ResultFilter
        }