Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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;
        }
Пример #4
0
        /// <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
            }
        }
Пример #5
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
            }
        }
Пример #6
0
 /// <summary>
 /// 新增[响应/错误]日志
 /// </summary>
 /// <param name="param"></param>
 /// <returns></returns>
 public Task AddResponseLogAsync(AddResponseLogParam param)
 {
     return(apiLogsRepository.AddResponseLogAsync(param));
 }
Пример #7
0
        /// <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
            }
        }
Пример #8
0
        /// <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
            }
        }
Пример #9
0
        /// <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));
        }