/// <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); }