Exemple #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="descriptor"></param>
        /// <returns></returns>
        public HttpRequest GetRequest(RequestDescriptor descriptor)
        {
            var request = new HttpRequest
            {
                Method  = descriptor.HttpOption.Method ?? HttpMethod.Post,
                Content = _contentGenerator.GetContent(descriptor)
            };

            SetHeader(descriptor, request.Headers);
            request.RequestUri  = GetUri(descriptor);
            request.RequestHash = ComputeRequestHash(descriptor, request);
            return(request);
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="TOutData"></typeparam>
        /// <param name="descriptor"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <ResponseWrapper <TOutData> > SendAndWrapAsync <TOutData>(RequestDescriptor descriptor, CancellationToken token = default)
        {
            var wrapper = await SendAndWrapAsync(descriptor, token);

            var response         = wrapper.Response;
            var responseResolver = _resolverFactory.GetResolver(descriptor.HttpOption.ResponseResolverType, response?.Content?.Headers);
            var outData          = await responseResolver.Resolve <TOutData>(response, descriptor.ExtendData);

            return(new ResponseWrapper <TOutData>(wrapper)
            {
                Data = outData
            });
        }
Exemple #3
0
        /// <summary>
        /// 计算请求hash值
        /// </summary>
        /// <param name="descriptor"></param>
        /// <returns></returns>
        protected virtual string ComputeRequestHash(RequestDescriptor descriptor, HttpRequest request)
        {
            var uri = request.RequestUri.ToString();

            using (var md5 = MD5.Create())
            {
                var           bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(uri));
                StringBuilder sb    = new StringBuilder();
                foreach (var b in bytes)
                {
                    sb.Append(b.ToString("x2"));
                }
                return(sb.ToString());
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="descriptor"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <ResponseWrapper> SendAndWrapAsync(RequestDescriptor descriptor, CancellationToken token = default)
        {
            var requestBuilder = _builderFactory.GetBuilder(descriptor.HttpOption.RequestBuilderType);
            var request        = requestBuilder.GetRequest(descriptor);

            var result = _cacheOperator.Read(request);

            if (!result.HasHitCache)
            {
                var argument = new RetryPolicyArgument
                {
                    Service           = descriptor.ServiceName,
                    Module            = descriptor.ModuleName,
                    Option            = descriptor.HttpOption.RetryOption,
                    Request           = request,
                    IsSuccessResponse = descriptor.HttpOption.IsSuccessResponse,
                    Sending           = async message =>
                    {
                        var client          = _clientFactory.CreateClient(descriptor.ServiceName);
                        var responseMessage = await client.SendAsync(message, token);

                        return(new HttpResponse(responseMessage));
                    }
                };
                result = await _retryProcessor.ProcessAsync(argument);

                //调用日志记录器,写缓存(如果符合条件)
                _cacheOperator.Write(result.Response, descriptor.HttpOption.CacheOption);
            }
            try
            {
                //保存请求信息,请求结果
                await _recordStore.WriteAsync(descriptor, result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"日志记录器{_recordStore.GetType().Name},写入日志时出错:{ex.Message}");
            }

            if (result.Exception != null)
            {
                throw result.Exception;
            }
            return(result);
        }
Exemple #5
0
        protected virtual void SetHeader(RequestDescriptor descriptor, HttpRequestHeaders header)
        {
            var headers = descriptor.Headers;

            foreach (var key in headers.Keys)
            {
                foreach (var v in headers[key])
                {
                    var value    = v;
                    var template = new StringTemplate(value);
                    if (!template.HaveVariable)
                    {
                        header.Add(key, value);
                        continue;
                    }
                    _logger.LogInformation($"{key}:{value}需要进行模板替换");
                    //尝试使用uri参数进行替换
                    value    = template.TryReplaceVariable(descriptor.UriQuery);
                    template = new StringTemplate(value);
                    if (!template.HaveVariable)
                    {
                        header.Add(key, value);
                        continue;
                    }
                    //尝试使用ExtendData进行替换
                    value    = template.TryReplaceVariable(descriptor.ExtendData);
                    template = new StringTemplate(value);
                    if (!template.HaveVariable)
                    {
                        header.Add(key, value);
                        continue;
                    }
                    //尝试使用Body进行替换
                    value = template.TryReplaceVariable(descriptor.Body, true);
                    header.Add(key, value);
                }
            }
        }
Exemple #6
0
        //public HttpContentGenerator()
        //{
        //}

        /// <summary>
        ///
        /// </summary>
        /// <param name="descriptor"></param>
        /// <returns></returns>
        public HttpContent GetContent(RequestDescriptor descriptor)
        {
            if (descriptor.Body == null)
            {
                return(null);
            }

            //如果未设置contentType则按stringcontent发送
            if (string.IsNullOrEmpty(descriptor.HttpOption.ContentType))
            {
                var encoding = Encoding.GetEncoding(descriptor.HttpOption.Encoding ?? "utf-8");
                return(new StringContent(descriptor.Body.ToString(), encoding, MimeTypes.Text.Plain));
            }

            if (descriptor.HttpOption.ContentType.Equals(MimeTypes.Application.Json,
                                                         StringComparison.CurrentCultureIgnoreCase))
            {
                return(JsonContent(descriptor.Body, descriptor.HttpOption.Encoding));
            }
            if (descriptor.HttpOption.ContentType.Equals(MimeTypes.Application.Xml,
                                                         StringComparison.CurrentCultureIgnoreCase))
            {
                return(XmlContent(descriptor.Body, descriptor.HttpOption.Encoding));
            }
            if (descriptor.HttpOption.ContentType.Equals(MimeTypes.Application.XWwwFormUrlencoded,
                                                         StringComparison.CurrentCultureIgnoreCase))
            {
                return(FormUrlContent(descriptor.Body, descriptor.HttpOption.Encoding));
            }
            if (descriptor.HttpOption.ContentType.Equals(MimeTypes.Application.OctetStream,
                                                         StringComparison.CurrentCultureIgnoreCase))
            {
                return(ByteContent(descriptor.Body));
            }
            //MultipartFormDataContent

            throw new Exception($"不支持的ContentType{descriptor.HttpOption.ContentType}");
        }
Exemple #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="descriptor"></param>
        /// <returns></returns>
        protected virtual Uri GetUri(RequestDescriptor descriptor)
        {
            var tempUri  = descriptor.HttpOption.Uri;
            var template = new StringTemplate(tempUri);

            if (template.HaveVariable) //使用query替换变量
            {
                tempUri  = template.TryReplaceVariable(descriptor.UriQuery);
                template = new StringTemplate(tempUri);
                if (template.HaveVariable) //使用context.ExtendData替换变量
                {
                    _logger.LogInformation($"uri:{tempUri} 使用{nameof(descriptor.UriQuery)}未完全替换");
                    tempUri  = template.TryReplaceVariable(descriptor.ExtendData);
                    template = new StringTemplate(tempUri);
                    if (template.HaveVariable) //使用body替换变量
                    {
                        _logger.LogInformation($"uri:{tempUri}使用{nameof(descriptor.ExtendData)}未完全替换");
                        tempUri = template.TryReplaceVariable(descriptor.Body, true);
                    }
                }
            }
            return(descriptor.UriQuery.Concat(tempUri));
        }
Exemple #8
0
 public async Task WriteAsync(RequestDescriptor description, ResponseWrapperResult result)
 {
     await Task.CompletedTask;
 }