/// <summary>
        /// 进入处理
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            #region 获取传入的数据

            var jsonData = string.Empty;

            if (context.HttpContext.Request.ContentType != null)
            {
                var contentType = context.HttpContext.Request.ContentType.ToLower();
                if ((contentType.Contains("application/x-www-form-urlencoded") ||
                     contentType.Contains("multipart/form-data")) &&
                    context.HttpContext.Request.ContentLength != null &&
                    context.HttpContext.Request.ContentLength > 0)
                {
                    jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(context.HttpContext.Request.Form);
                }
                else if (contentType.Contains("application/json"))
                {
                    foreach (var item in context.ActionArguments)
                    {
                        jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(item.Value);
                        continue;
                    }
                }
            }

            #endregion

            #region 新增接口日志

            //获取日志ID
            var logTraceID  = PoJun.Util.Helpers.Id.GetGuidBy32();
            var requestTime = DateTime.Now;

            var logParam = new AddRequestLogParam();
            logParam.APIName = context.HttpContext.Request.Path;
            //这里存储的是客户端的IP+端口
            logParam.ClientHost  = $"{context.HttpContext.Connection.RemoteIpAddress.ToString()}:{context.HttpContext.Connection.RemotePort}";
            logParam.Headers     = Newtonsoft.Json.JsonConvert.SerializeObject(context.HttpContext.Request.Headers.ToList());
            logParam.Level       = 1;
            logParam.RequestBody = jsonData;
            //这里存储的当前服务器的IP+端口+接口地址+url参数
            logParam.ServerHost  = $"{SysUtil.Ip}:{context.HttpContext.Request.Host.Port}{context.HttpContext.Request.Path}{context.HttpContext.Request.QueryString}";
            logParam.SystemID    = SysUtil.GetSystemId();
            logParam.TraceID     = logTraceID;
            logParam.RequestTime = requestTime;

            //新增日志
            var log = await apiLogService.AddRequestLogAsync(logParam);

            #endregion

            #region 向后传输数据

            //把日志ID写入
            context.HttpContext.Items.Add(nameof(APILogConfig.PoJun_LogTraceID), logTraceID);
            context.HttpContext.Request.Headers.Add(nameof(APILogConfig.PoJun_LogTraceID), logTraceID);
            //把接口请求时间写入
            context.HttpContext.Items.Add(nameof(APILogConfig.RequestTime), requestTime);
            context.HttpContext.Request.Headers.Add(nameof(APILogConfig.RequestTime), requestTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));

            #endregion

            #region 全局DTO对象参数验证

            if (!context.ModelState.IsValid)
            {
                //使用自定义参数绑定验证体系
                var    modelState = context.ModelState.FirstOrDefault(f => f.Value.Errors.Any());
                string errorMsg   = modelState.Value.Errors.First().ErrorMessage;
                throw new ParamErrorException(errorMsg);
            }

            #endregion

            await base.OnActionExecutionAsync(context, next);
        }
示例#2
0
        /// <summary>
        /// GET请求[同步]
        /// </summary>
        /// <typeparam name="T">只能传入DTO对象</typeparam>
        /// <param name="host">域名</param>
        /// <param name="apiName">接口名称(接口地址)</param>
        /// <param name="headers">请求头</param>
        /// <param name="timeout">请求响应超时时间,单位/s(默认100秒)</param>
        /// <returns></returns>
        public T HttpGet <T>(string host, string apiName, Dictionary <string, string> headers = null, int timeout = 100)
        {
            var client = clientFactory.CreateClient("base");
            {
                #region Http基础设置

                //设置HTTP请求头
                if (headers != null)
                {
                    foreach (KeyValuePair <string, string> header in headers)
                    {
                        client.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                }
                //设置接口超时时间
                if (timeout > 0)
                {
                    client.Timeout = new TimeSpan(0, 0, timeout);
                }

                #endregion

                #region 新增请求日志

                var log_request_param = new AddRequestLogParam();
                log_request_param.APIName       = apiName.ToString().ToLower();
                log_request_param.ClientHost    = SysUtil.Ip;
                log_request_param.RequestTime   = DateTime.Now;
                log_request_param.ServerHost    = host;
                log_request_param.SystemID      = SysUtil.GetSystemId();
                log_request_param.TraceID       = PoJun.Util.Helpers.Id.GetGuidBy32();
                log_request_param.Level         = 2;
                log_request_param.ParentTraceID = SysUtil.GetTraceId();
                log_request_param.RequestBody   = null;
                if (SysUtil.GetTraceId() != null)
                {
                    log_request_param.Level         = 2;
                    log_request_param.ParentTraceID = SysUtil.GetTraceId();
                }
                else
                {
                    log_request_param.Level = 1;
                }
                var log_request_result = apiLogService.AddRequestLogAsync(log_request_param).Result;

                #endregion

                #region 发起Http请求

                var    url         = $"{host}{apiName}";
                Byte[] resultBytes = client.GetByteArrayAsync(url).Result;
                var    result      = Encoding.UTF8.GetString(resultBytes);

                #endregion

                #region 新增响应日志

                var log_response_param = new AddResponseLogParam();
                log_response_param.IsError       = false;
                log_response_param.ParentTraceID = log_request_param.TraceID;
                log_response_param.ResponseBody  = result;
                log_response_param.ResponseTime  = DateTime.Now;
                log_response_param.TimeCost      = Convert.ToInt32((log_response_param.ResponseTime - log_request_param.RequestTime).TotalMilliseconds);

                apiLogService.AddResponseLogAsync(log_response_param).Wait();

                #endregion

                #region 返回结果

                return(Newtonsoft.Json.JsonConvert.DeserializeObject <T>(result));

                #endregion
            }
        }