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 }