/// <summary>
        /// 记录Http请求上下文
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task OnResourceExecutedAsync(ResourceExecutingContext context)
        {
            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

            if (!controllerActionDescriptor.MethodInfo.GetCustomAttributes(typeof(SkipFilterAttribute), false).Any())
            {
                var log = new HttpContextMessage
                {
                    UserId             = context.HttpContext.User.Claims.FirstOrDefault(x => x.Type == "UserId")?.Value,
                    RequestMethod      = context.HttpContext.Request.Method,
                    ResponseStatusCode = context.HttpContext.Response.StatusCode,
                    RequestQurey       = context.HttpContext.Request.QueryString.ToString(),
                    RequestContextType = context.HttpContext.Request.ContentType,
                    RequestHost        = context.HttpContext.Request.Host.ToString(),
                    RequestPath        = context.HttpContext.Request.Path,
                    RequestScheme      = context.HttpContext.Request.Scheme,
                    RequestLocalIp     = (context.HttpContext.Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + context.HttpContext.Request.HttpContext.Connection.LocalPort),
                    RequestRemoteIp    = (context.HttpContext.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() + ":" + context.HttpContext.Request.HttpContext.Connection.RemotePort)
                };

                //获取请求的Body
                //数据流倒带 context.HttpContext.Request.EnableRewind();
                if (context.HttpContext.Request.Body.CanSeek)
                {
                    using (var requestSm = context.HttpContext.Request.Body)
                    {
                        requestSm.Position = 0;
                        var reader = new StreamReader(requestSm, Encoding.UTF8);
                        log.RequestBody = reader.ReadToEnd();
                    }
                }

                //将当前 http 响应Body 转换为 IReadableBody
                if (context.HttpContext.Response.Body is IReadableBody body)
                {
                    if (body.IsRead)
                    {
                        log.ResponseBody = await body.ReadAsStringAsync();
                    }
                }
                if (string.IsNullOrEmpty(log.ResponseBody) == false && log.ResponseBody.Length > 200)
                {
                    log.ResponseBody = log.ResponseBody.Substring(0, 200) + "......";
                }
                LogHelper.Debug(log);
            }
        }
        /// <summary>
        /// 记录Http请求上下文
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task OnResourceExecutedAsync(ResourceExecutingContext context)
        {
            var log = new HttpContextMessage
            {
                RequestMethod      = context.HttpContext.Request.Method,
                ResponseStatusCode = context.HttpContext.Response.StatusCode,
                RequestQurey       = context.HttpContext.Request.QueryString.ToString(),
                RequestContextType = context.HttpContext.Request.ContentType,
                RequestHost        = context.HttpContext.Request.Host.ToString(),
                RequestPath        = context.HttpContext.Request.Path,
                RequestScheme      = context.HttpContext.Request.Scheme,
                RequestLocalIp     = (context.HttpContext.Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + context.HttpContext.Request.HttpContext.Connection.LocalPort),
                RequestRemoteIp    = (context.HttpContext.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() + ":" + context.HttpContext.Request.HttpContext.Connection.RemotePort)
            };

            //获取请求的Body
            //数据流倒带 context.HttpContext.Request.EnableRewind();
            if (context.HttpContext.Request.Body.CanSeek)
            {
                using (var requestSm = context.HttpContext.Request.Body)
                {
                    requestSm.Position = 0;
                    var reader = new StreamReader(requestSm, Encoding.UTF8);
                    log.RequestBody = reader.ReadToEnd();
                }
            }

            //将当前 http 响应Body 转换为 IReadableBody
            if (context.HttpContext.Response.Body is IReadableBody body)
            {
                if (body.IsRead)
                {
                    log.ResponseBody = await body.ReadAsStringAsync();
                }
            }
            if (string.IsNullOrEmpty(log.ResponseBody) == false && log.ResponseBody.Length > 200)
            {
                log.ResponseBody = log.ResponseBody.Substring(0, 200) + "......";
            }
            LogHelper.Debug(log);
        }
        /// <summary>
        /// 执行响应流指向新对象
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            context.Request.EnableBuffering();
            var api = new HttpContextMessage
            {
                RequestMethod      = context.Request.Method,
                ResponseStatusCode = context.Response.StatusCode,
                RequestQurey       = context.Request.QueryString.ToString(),
                RequestContextType = context.Request.ContentType,
                RequestHost        = context.Request.Host.ToString(),
                RequestPath        = context.Request.Path,
                RequestScheme      = context.Request.Scheme,
                RequestLocalIp     = (context.Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + context.Request.HttpContext.Connection.LocalPort),
                RequestRemoteIp    = (context.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() + ":" + context.Request.HttpContext.Connection.RemotePort)
            };

            var request  = context.Request.Body;
            var response = context.Response.Body;
            //请求序列号
            string serialNumber = "";

            try
            {
                using (var newRequest = new MemoryStream())
                {
                    //替换request流
                    context.Request.Body = newRequest;

                    using (var newResponse = new MemoryStream())
                    {
                        //替换response流
                        context.Response.Body = newResponse;

                        using (var reader = new StreamReader(request))
                        {
                            //读取原始请求流的内容
                            api.RequestBody = await reader.ReadToEndAsync();

                            if (string.IsNullOrEmpty(api.RequestBody))
                            {
                                //await _next.Invoke(context);
                            }
                            else
                            {
                                JObject jObject = JObject.Parse(api.RequestBody);
                                if (jObject["SerialNumber"] != null)
                                {
                                    if (!string.IsNullOrEmpty(jObject["SerialNumber"].ToString()))
                                    {
                                        serialNumber = jObject["SerialNumber"].ToString();
                                    }
                                }
                            }
                        }

                        using (var writer = new StreamWriter(newRequest))
                        {
                            await writer.WriteAsync(api.RequestBody);

                            await writer.FlushAsync();

                            newRequest.Position  = 0;
                            context.Request.Body = newRequest;
                            await _next(context);
                        }

                        using (var reader = new StreamReader(newResponse))
                        {
                            newResponse.Position = 0;
                            api.ResponseBody     = await reader.ReadToEndAsync();

                            try
                            {
                                JObject resJObect = JObject.Parse(api.ResponseBody);
                                resJObect["SerialNumber"] = serialNumber;
                                api.ResponseBody          = resJObect.ToJson();
                            }
                            catch
                            {
                            }
                        }

                        context.Response.Clear();

                        using (var writer = new StreamWriter(response, System.Text.Encoding.UTF8))
                        {
                            await writer.WriteAsync(api.ResponseBody);

                            await writer.FlushAsync();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ResponseResult responseResult = new ResponseResult();
                responseResult.SerialNumber = serialNumber;
                context.Response.Clear();
                context.Response.StatusCode = StatusCodes.Status200OK;
                responseResult.Code         = ResponseResultType.Error;
                responseResult.Message      = "对不起,系统开小差了!!!";
                //记录异常
                Log4NetUtil.LogError("全局捕获异常SerialNumber:" + responseResult.SerialNumber, ex);
                using (var writer = new StreamWriter(response))
                {
                    await writer.WriteAsync(responseResult.ToJson());

                    await writer.FlushAsync();
                }
            }
            finally
            {
                context.Request.Body  = request;
                context.Response.Body = response;
            }

            // 响应完成时存入缓存
            context.Response.OnCompleted(() =>
            {
                //记录响应报文
                Log4NetUtil.LogDebug(api.ToString());
                return(Task.CompletedTask);
            });
        }