当您以异步方式使用 HttpClient 时,您是否曾经在帖子中看到请求的正文在 2 个请求之间交换?

Have you ever seen the request's body in the post to be exchanged between 2 requests, when you use HttpClient in an Async way?

提问人:PJS 提问时间:9/20/2023 最后编辑:Peter CsalaPJS 更新时间:9/21/2023 访问量:43

问:

客户报告说,2个寄存器相互交换了信息,在一千个请求中只有2个。 寄存器 A 具有有关寄存器 B 的正文信息,反之亦然。 这是在我的环境中第一次发生的,当时网络出现跳动。 在这里,您可以看到我如何创建我的 HTTP 客户端并使用它。 如果您有任何其他帮助,请告诉我,非常感谢大家!

如何从控制器和服务调用 Exec?

控制器

[HttpPost()]
public async Task<ActionResult<ResponseModel>> Exec(RequestModel model) 
{ 
   return await _service.Exec(model); 
} 

服务层

public async Task<ResponseModel> Exec (Request model)
{ 
   return await _service.Exec(model); 
} 

Dal 层

public async Task<ResponseModel> Exec(RequestModel model)
{
   var httpClientHandler = HttpClientHandler();
   httpClientHandler.UseProxy = true;
   var proxy = new WebProxy
   {
      Address = new Uti("proxy_uri",
      BypassProxyOnLocal = false,
      UseDefaultCredentials = true
   };

   httpClientHandler .Proxy = proxy;

   var httpClient = new HttpClient(httpClientHandler);

   var request = new HttpRequestMessage(HttpMethod.Post, "endpoint_uri");
   request.Headers.Add("Authorization","your token auth");
   
   string jsonStr = Json.Serializer.Serialize(model);
   var content = new StringContent(jsonStr, null, "application/json");
   request.Content = content;
   
   var response = await httpClient.SendAsync(request);

   return await response.Content.ReadFromJsonAsync<ResponseModel>();
}

我无法模拟这种情况,但我相信我犯了一个错误或误用了 HTTP 客户端实现。 我使用 webapi 项目目标框架 netcoreapp3.1。 System.Net.Http 版本 = 4.2.2.0

C# 异步 任务 Exchange-Server dotnet-httpclient

评论

2赞 Theodor Zoulias 9/21/2023
顺便说一句,该类旨在实例化一次,并在应用程序的整个生命周期内重复使用。不过,这应该与您的问题无关。HttpClient
1赞 Panagiotis Kanavos 9/21/2023
Have you ever从不。我怀疑调用相同方法的代码将它们混淆了。我不知道你说的throttle是什么意思,但如果你的意思是节流问题,很可能是代码(缺少)无法处理这个问题并返回了之前的结果。类名也表明了不合适的体系结构。Exchange 是一种远程服务,而不是数据存储。Exec
1赞 Panagiotis Kanavos 9/21/2023
强烈建议您查看与 Polly 重试策略一起注册的类型化客户端。你已必须进行重大更改 - .NET Core 3.1 已于去年结束生命周期。目前受支持的最早的 .NET Core 版本是 .NET 6,而 .NET 8 位于 RC1 中AddHttpClient
1赞 Panagiotis Kanavos 9/21/2023
即使在 .NET Core 3.1 中,AddHttpClient 也会正确注册、重用和回收 HttpClient 实例。NET 6 的 PostAsJsonAsync 将消除整个方法。Polly 将根据需要重试或限制请求。Dal.Exec

答: 暂无答案