/// <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); }
/// <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 } }