/// <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 }); }
/// <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); }
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); } } }
//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}"); }
/// <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)); }
public async Task WriteAsync(RequestDescriptor description, ResponseWrapperResult result) { await Task.CompletedTask; }