/// <summary> /// 新增返回日志 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { #region 新增接口返回日志 object logTraceID = null; context.HttpContext.Items.TryGetValue(nameof(APILogConfig.PoJun_LogTraceID), out logTraceID); if (logTraceID != null) { object _requestTime = null; context.HttpContext.Items.TryGetValue(nameof(APILogConfig.RequestTime), out _requestTime); var logParam = new AddResponseLogParam(); if (context.Result != null) { dynamic json = Newtonsoft.Json.Linq.JToken.Parse(Newtonsoft.Json.JsonConvert.SerializeObject(context.Result)) as dynamic; logParam.ResponseBody = Convert.ToString(json.Value); } logParam.IsError = false; logParam.ParentTraceID = logTraceID.ToString(); logParam.ResponseTime = DateTime.Now; logParam.TimeCost = Convert.ToInt32((logParam.ResponseTime - Convert.ToDateTime(_requestTime)).TotalMilliseconds); await apiLogService.AddResponseLogAsync(logParam); } #endregion await base.OnResultExecutionAsync(context, next); }
/// <summary> /// 新增响应日志 /// </summary> /// <param name="param"></param> /// <returns></returns> public Task AddResponseLogAsync(AddResponseLogParam param) { var filter = Filter.Eq(nameof(APILogs.ID), param.ParentTraceID); var update = Update .Set(nameof(APILogs.ResponseBody), param.ResponseBody) .Set(nameof(APILogs.ResponseTime), DateTime.Now) .Set(nameof(APILogs.TimeCost), param.TimeCost); if (param.IsError) { update = update.Set(nameof(APILogs.IsError), param.IsError) .Set(nameof(APILogs.ErrorBody), param.ErrorBody) .Set(nameof(APILogs.ErrorBody), param.ErrorBody); } return(this.UpdateOneAsync(filter, update)); }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task OnExceptionAsync(ExceptionContext context) { var dto = new BaseResponse(); bool isError = false; if (context.Exception.GetType().ToString() == typeof(PoJun.Shadow.Exception.RepeatSubmitException).ToString()) { dto.DetailedStatus = DetailedStatusCode.RepeatSubmit; if (string.IsNullOrEmpty(context.Exception.Message)) { dto.DetailedMessage = $"{dto.DetailedStatus.Description()}"; } else { dto.DetailedMessage = $"{context.Exception.Message}"; } dto.GatewayStatus = GatewayStatusCode.Fail; dto.GatewayMessage = dto.GatewayStatus.Description(); } else if (context.Exception.GetType().ToString() == typeof(PoJun.Shadow.Exception.ParamErrorException).ToString()) { dto.DetailedStatus = DetailedStatusCode.ParamsError; if (string.IsNullOrEmpty(context.Exception.Message)) { dto.DetailedMessage = $"{dto.DetailedStatus.Description()}"; } else { dto.DetailedMessage = $"{context.Exception.Message}"; } dto.GatewayStatus = GatewayStatusCode.Fail; dto.GatewayMessage = dto.GatewayStatus.Description(); } else if (context.Exception.GetType().ToString() == typeof(PoJun.Shadow.Exception.FailException).ToString()) { dto.DetailedStatus = DetailedStatusCode.Fail; if (string.IsNullOrEmpty(context.Exception.Message)) { dto.DetailedMessage = $"{dto.DetailedStatus.Description()}"; } else { dto.DetailedMessage = $"{context.Exception.Message}"; } dto.GatewayStatus = GatewayStatusCode.Fail; dto.GatewayMessage = dto.GatewayStatus.Description(); } else { dto.DetailedStatus = DetailedStatusCode.Error; dto.DetailedMessage = $"{dto.DetailedStatus.Description()}"; dto.GatewayStatus = GatewayStatusCode.Fail; dto.GatewayMessage = dto.GatewayStatus.Description(); isError = true; } var result = Newtonsoft.Json.JsonConvert.SerializeObject(dto); context.Result = new ContentResult() { Content = result }; #region 新增接口返回日志 object logTraceID = null; context.HttpContext.Items.TryGetValue(nameof(APILogConfig.PoJun_LogTraceID), out logTraceID); if (logTraceID != null) { object _requestTime = null; context.HttpContext.Items.TryGetValue(nameof(APILogConfig.RequestTime), out _requestTime); var logParam = new AddResponseLogParam(); logParam.ResponseBody = result; logParam.ErrorBody = $"StackTrace:{context.Exception.StackTrace} | Message:{context.Exception.Message} | Source:{context.Exception.Source}"; logParam.IsError = isError; logParam.ParentTraceID = logTraceID.SafeString(); logParam.ResponseTime = DateTime.Now; logParam.TimeCost = Convert.ToInt32((logParam.ResponseTime - Convert.ToDateTime(_requestTime)).TotalMilliseconds); await apiLogService.AddResponseLogAsync(logParam); } #endregion context.Exception = null; }
/// <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 AddResponseLogAsync(AddResponseLogParam param) { return(apiLogsRepository.AddResponseLogAsync(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 } }
/// <summary> /// 新增响应日志 /// </summary> /// <param name="param"></param> /// <returns></returns> public Task AddResponseLogAsync(AddResponseLogParam param) { var sqlStr = $"update {nameof(APILogs)} set {nameof(APILogs.ResponseBody)} = @{nameof(AddResponseLogParam.ResponseBody)},{nameof(APILogs.ResponseTime)} = @{nameof(AddResponseLogParam.ResponseTime)},{nameof(APILogs.TimeCost)} = @{nameof(AddResponseLogParam.TimeCost)},{nameof(APILogs.IsError)} = @{nameof(AddResponseLogParam.IsError)},{nameof(APILogs.ErrorBody)} = @{nameof(AddResponseLogParam.ErrorBody)},{nameof(APILogs.ErrorBody)} = @{nameof(AddResponseLogParam.ErrorBody)} where {nameof(APILogs.ID)} = @{nameof(AddResponseLogParam.ParentTraceID)}"; return(this.ExecuteAsync(sqlStr, param)); }