Esempio n. 1
0
            /// <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);
        }
Esempio n. 3
0
        /// <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
        }