Example #1
0
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var modelState = context.ModelState;

            if (!modelState.IsValid)
            {
                var message = string.Empty;
                //获取第一个错误提示
                foreach (var key in modelState.Keys)
                {
                    var state = modelState[key];
                    if (state.Errors.Any())
                    {
                        message = state.Errors.First().ErrorMessage;
                        break;
                    }
                }
                if (!string.IsNullOrWhiteSpace(message))
                {
                    var errorInfo = _jsonHelper.DeserializeObject <ErrorResult>(message);
                    if (errorInfo != null)
                    {
                        throw new BucketException(errorInfo.ErrorCode, errorInfo.Message);
                    }
                }
            }
            // 埋点
            HttpUrl = new StringBuilder().Append(context.HttpContext.Request.Scheme)
                      .Append("://")
                      .Append(context.HttpContext.Request.Host)
                      .Append(context.HttpContext.Request.PathBase)
                      .Append(context.HttpContext.Request.Path)
                      .Append(context.HttpContext.Request.QueryString)
                      .ToString();
            if (context.HttpContext.Request.Method.ToLower() == HttpMethod.Post.ToString().ToLower())
            {
                using (var ms = new MemoryStream())
                {
                    try { context.HttpContext.Request.Body.Position = 0; } catch (Exception ex) { }
                    context.HttpContext.Request.Body.CopyTo(ms);
                    ms.Position = 0;
                    var myByteArray = ms.ToArray();
                    ActionInput = Encoding.UTF8.GetString(myByteArray);
                }
            }
            else if (context.HttpContext.Request.Method.ToLower() == HttpMethod.Get.ToString().ToLower())
            {
                ActionInput = context.HttpContext.Request.QueryString.Value;
            }
            _buriedContext.PublishAsync(new BuriedInformationInput {
                FuncName = context.HttpContext.Request.Path, ApiType = 1, ApiUri = HttpUrl, BussinessSuccess = 0, CalledResult = 0, InputParams = ActionInput
            }).GetAwaiter();
        }
        public async Task Invoke(HttpContext context)
        {
            ErrorResult errorInfo = null;

            try
            {
                await _next(context);
            }
            catch (BucketException ex)
            {
                var newMsg = _errorCodeStore.StringGet(ex.ErrorCode);
                if (string.IsNullOrWhiteSpace(newMsg))
                {
                    newMsg = ex.ErrorMessage;
                }
                errorInfo = new ErrorResult(ex.ErrorCode, newMsg);
            }
            catch (Exception ex)
            {
                errorInfo = new ErrorResult("-1", "系统开小差了,请稍后再试");
                _logger.LogError(ex, $"全局异常捕获,状态码:{ context.Response.StatusCode}");
            }
            finally
            {
                if (errorInfo != null)
                {
                    var Message    = JsonConvert.SerializeObject(errorInfo);
                    var inputParam = string.Empty;
                    var HttpUrl    = new StringBuilder().Append(context.Request.Scheme)
                                     .Append("://")
                                     .Append(context.Request.Host)
                                     .Append(context.Request.PathBase)
                                     .Append(context.Request.Path)
                                     .Append(context.Request.QueryString)
                                     .ToString();
                    if (context.Request.Method.ToLower() == HttpMethod.Post.ToString().ToLower())
                    {
                        using (var ms = new MemoryStream())
                        {
                            try { context.Request.Body.Position = 0; } catch (Exception ex) { }
                            context.Request.Body.CopyTo(ms);
                            ms.Position = 0;
                            var myByteArray = ms.ToArray();
                            inputParam = Encoding.UTF8.GetString(myByteArray);
                        }
                    }
                    else if (context.Request.Method.ToLower() == HttpMethod.Get.ToString().ToLower())
                    {
                        inputParam = context.Request.QueryString.Value;
                    }
                    await _buriedContext.PublishAsync(new BuriedInformationInput
                    {
                        FuncName         = context.Request.Path,
                        ApiType          = 1,
                        ApiUri           = HttpUrl,
                        BussinessSuccess = 0,
                        CalledResult     = errorInfo.ErrorCode == "-1" ? -1 : 0,
                        InputParams      = inputParam,
                        OutputParams     = Message,
                        ErrorCode        = errorInfo.ErrorCode
                    });
                    await HandleExceptionAsync(context, Message);
                }
            }
        }
Example #3
0
        /// <summary>
        /// get 请求
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serviceName"></param>
        /// <param name="webApiPath"></param>
        /// <param name="scheme"></param>
        /// <param name="customHeaders"></param>
        /// <param name="MediaType"></param>
        /// <param name="isBuried"></param>
        /// <returns></returns>
        public T GetWebApi <T>(string serviceName, string webApiPath,
                               string scheme = "http",
                               Dictionary <string, string> customHeaders = null,
                               string MediaType = "application/json",
                               bool isBuried    = false)
        {
            #region 负载寻址
            var _load = _loadBalancerHouse.Get(serviceName).GetAwaiter().GetResult();
            if (_load == null)
            {
                throw new ArgumentNullException(nameof(_load));
            }
            var HostAndPort = _load.Lease().GetAwaiter().GetResult();
            if (HostAndPort == null)
            {
                throw new ArgumentNullException(nameof(HostAndPort));
            }
            string baseAddress = $"{scheme}://{HostAndPort.ToString()}";
            webApiPath = webApiPath.StartsWith("/") ? webApiPath : "/" + webApiPath;
            #endregion

            #region  游请求头处理
            // 请求头下发,埋点请求头
            if (customHeaders == null)
            {
                customHeaders = new Dictionary <string, string>();
            }
            var downStreamHeaders = _buriedContext.DownStreamHeaders();
            // 合并键值
            customHeaders = customHeaders.Concat(downStreamHeaders).ToDictionary(k => k.Key, v => v.Value);
            #endregion

            #region 请求埋点
            if (isBuried) // 埋点
            {
                _buriedContext.PublishAsync(new
                {
                    ApiType          = 1,
                    ApiUri           = string.Concat(baseAddress, "/", webApiPath),
                    BussinessSuccess = 0,
                    CalledResult     = 0,
                    InputParams      = webApiPath
                }).GetAwaiter();
            }
            #endregion

            #region http 请求
            var request = new HttpRequestMessage
            {
                RequestUri = new Uri($"{baseAddress}{webApiPath}"),
                Method     = HttpMethod.Get
            };
            request.Headers.Clear();
            request.Headers.Accept.Clear();
            if (customHeaders != null)
            {
                foreach (KeyValuePair <string, string> customHeader in customHeaders)
                {
                    request.Headers.Add(customHeader.Key, customHeader.Value);
                }
            }
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaType));
            var httpResponseMessage = _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead).GetAwaiter().GetResult();
            if (httpResponseMessage.StatusCode == HttpStatusCode.OK || httpResponseMessage.StatusCode == HttpStatusCode.NotModified)
            {
                var content = httpResponseMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();

                #region 请求埋点
                if (isBuried) // 埋点
                {
                    _buriedContext.PublishAsync(new
                    {
                        ApiType          = 1,
                        ApiUri           = string.Concat(baseAddress, "/", webApiPath),
                        BussinessSuccess = 0,
                        CalledResult     = 0,
                        InputParams      = webApiPath,
                        OutputParams     = content,
                    }).GetAwaiter();
                }
                #endregion

                return(_jsonHelper.DeserializeObject <T>(content));
            }
            #endregion

            throw new Exception($"服务{serviceName},路径{webApiPath}请求出错");
        }