/// <summary> /// 重写Invoke /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override async Task Invoke(AspectContext context, AspectDelegate next) { var config = context.ServiceProvider.GetService(typeof(IConfiguration)) as IConfiguration; var prefix = config["RedisPrefix:DistributedLock"]; if (string.IsNullOrWhiteSpace(prefix)) { throw new H_Exception("请配置分布式锁名称的前缀字符"); } using (var redisLock = RedisHelper.Lock(prefix + _lockName, _timeoutSeconds, _autoDelay)) { if (redisLock == null) { H_Log.Error("系统异常:开启Redis分布式锁失败"); throw new H_Exception("系统异常"); } //if (redisLock == null) throw new H_Exception("系统异常"); //开启分布式锁超时 //对象为null,不占资源 ,编译后的代码没有fianlly,不执行dispose()方法 //锁超时是什么意思呢?如果一个得到锁的线程在执行任务的过程中挂掉,来不及显式地释放锁,这块资源将会永远被锁住,别的线程再也别想进来。 //所以,setnx的key必须设置一个超时时间,以保证即使没有被显式释放,这把锁也要在一定时间后自动释放。 await next(context); } }
//静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 //静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。 /// <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> /// 异常处理,不会处理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 }