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); } } }
/// <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}请求出错"); }