/// <summary> /// 新增请求日志 /// </summary> /// <param name="param"></param> /// <returns></returns> public async Task <AddRequestLogModel> AddRequestLogAsync(AddRequestLogParam param) { var entity = param.MapTo(new APILogs()); entity.ID = param.TraceID; entity.RequestTime = DateTime.Now; await this.InsertAsync(entity); return(new AddRequestLogModel() { RequestTime = entity.RequestTime, TraceID = param.TraceID }); }
/// <summary> /// 新增请求日志 /// </summary> /// <param name="param"></param> /// <returns></returns> public async Task <AddRequestLogModel> AddRequestLogAsync(AddRequestLogParam param) { var result = new AddRequestLogModel(); param.RequestTime = DateTime.Now; result.RequestTime = param.RequestTime; result.TraceID = param.TraceID; //创建SQL语句 var sqlStr = $"insert into {nameof(APILogs)} ({nameof(APILogs.ID)},{nameof(APILogs.ParentTraceID)},{nameof(APILogs.SystemID)},{nameof(APILogs.APIName)},{nameof(APILogs.ClientHost)},{nameof(APILogs.ServerHost)},{nameof(APILogs.Level)},{nameof(APILogs.RequestBody)},{nameof(APILogs.Headers)},{nameof(APILogs.RequestTime)}) values(@{nameof(AddRequestLogParam.TraceID)},@{nameof(AddRequestLogParam.ParentTraceID)},@{nameof(AddRequestLogParam.SystemID)}, @{nameof(AddRequestLogParam.APIName)} , @{nameof(AddRequestLogParam.ClientHost)} , @{nameof(AddRequestLogParam.ServerHost)},@{nameof(AddRequestLogParam.Level)},@{nameof(AddRequestLogParam.RequestBody)},@{nameof(AddRequestLogParam.Headers)},@{nameof(AddRequestLogParam.RequestTime)})"; //新增日志 await this.ExecuteAsync(sqlStr, param); return(result); }
/// <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> /// Post请求[异步] /// </summary> /// <param name="host">域名</param> /// <param name="apiName">接口名称(接口地址)</param> /// <param name="dicParameters">接口参数</param> /// <param name="headers">请求头</param> /// <param name="timeout">请求响应超时时间,单位/s(默认100秒)</param> /// <param name="contentType">请求类型</param> /// <param name="isMultilevelNestingJson">是否为多层嵌套json</param> /// <returns></returns> public async Task <string> HttpPostAsync(string host, string apiName, IDictionary <string, string> dicParameters, Dictionary <string, string> headers = null, int timeout = 100, HttpContentType contentType = HttpContentType.Json, bool isMultilevelNestingJson = false) { var client = clientFactory.CreateClient("base"); { #region Http基础设置 //设置接口超时时间 if (timeout > 0) { client.Timeout = new TimeSpan(0, 0, timeout); } HttpContent content = new FormUrlEncodedContent(dicParameters); var _contentType = (contentType == HttpContentType.Json ? "application/json" : "application/x-www-form-urlencoded"); if (contentType == HttpContentType.Json) { if (isMultilevelNestingJson) { content = new StringContent(dicParameters["json"]); } else { content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(dicParameters)); } } content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(_contentType); //设置HTTP请求头 if (headers != null) { foreach (KeyValuePair <string, string> header in headers) { content.Headers.Add(header.Key, header.Value); } } #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 = Newtonsoft.Json.JsonConvert.SerializeObject(dicParameters); 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 = await apiLogService.AddRequestLogAsync(log_request_param); #endregion #region 发起Http请求 var url = $"{host}{apiName}"; //异步发送请求 var events = await client.PostAsync(url, content); //异步获取请求的结果 var strResult = await events.Content.ReadAsStringAsync(); #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 = strResult; log_response_param.ResponseTime = DateTime.Now; log_response_param.TimeCost = Convert.ToInt32((log_response_param.ResponseTime - log_request_param.RequestTime).TotalMilliseconds); await apiLogService.AddResponseLogAsync(log_response_param); #endregion #region 返回结果 return(strResult); #endregion } }
/// <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 } }
/// <summary> /// 新增请求日志 /// </summary> /// <param name="param"></param> /// <returns></returns> public Task <AddRequestLogModel> AddRequestLogAsync(AddRequestLogParam param) { return(apiLogsRepository.AddRequestLogAsync(param)); }
/// <summary> /// Post请求[同步] /// </summary> /// <typeparam name="T"></typeparam> /// <param name="host">域名</param> /// <param name="apiName">接口名称(接口地址)</param> /// <param name="dicParameters">接口参数</param> /// <param name="httpHandler">httpHandler</param> /// <param name="headers">请求头</param> /// <param name="timeout">请求响应超时时间,单位/s(默认100秒)</param> /// <param name="contentType">请求类型</param> /// <returns></returns> public T HttpPost <T>(string host, string apiName, IDictionary <string, string> dicParameters, DiscoveryHttpClientHandler httpHandler = null, Dictionary <string, string> headers = null, int timeout = 100, HttpContentType contentType = HttpContentType.Json) { using (HttpClient client = ((httpHandler == null) ? new HttpClient() : new HttpClient(httpHandler))) { #region Http基础设置 //设置接口超时时间 if (timeout > 0) { client.Timeout = new TimeSpan(0, 0, timeout); } HttpContent content = new FormUrlEncodedContent(dicParameters); var _contentType = (contentType == HttpContentType.Json ? "application/json" : "application/x-www-form-urlencoded"); if (contentType == HttpContentType.Json) { content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(dicParameters)); } content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(_contentType); //设置HTTP请求头 if (headers != null) { foreach (KeyValuePair <string, string> header in headers) { content.Headers.Add(header.Key, header.Value); } } #endregion #region 新增请求日志 var log_request_param = new AddRequestLogParam(); log_request_param.APIName = apiName; log_request_param.ClientHost = PoJun.Util.Helpers.Web.Host; 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.RequestBody = Newtonsoft.Json.JsonConvert.SerializeObject(dicParameters); 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}"; //异步发送请求 var events = client.PostAsync(url, content).Result; //异步获取请求的结果 var strResult = events.Content.ReadAsStringAsync().Result; #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 = strResult; 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>(strResult)); #endregion } }
/// <summary> /// GET请求[异步] /// </summary> /// <param name="host">域名</param> /// <param name="apiName">接口名称(接口地址)</param> /// <param name="headers">请求头</param> /// <param name="timeout">请求响应超时时间,单位/s(默认100秒)</param> /// <returns></returns> public async Task <string> HttpGetAsync(string host, string apiName, Dictionary <string, string> headers = null, int timeout = 0) { using (HttpClient client = new HttpClient()) { #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; log_request_param.ClientHost = PoJun.Util.Helpers.Web.Host; 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.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 = await apiLogService.AddRequestLogAsync(log_request_param); #endregion #region 发起Http请求 var url = $"{host}{apiName}"; Byte[] resultBytes = await client.GetByteArrayAsync(url); 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); await apiLogService.AddResponseLogAsync(log_response_param); #endregion #region 返回结果 return(result); #endregion } }