我们需要通过 HTTP POST 请求与第三方系统对话——根据此类请求的参数,有时处理时间会超过 5 分钟。
在这种情况下,我们使用 CURL 或 Postman 获取数据没有问题,但由于某种原因,我们的 HttpClient 实现挂起/保持卡住。即使创建一个临时控制台应用程序来与服务器对话也会导致以下行为:
请求开始 -> 等待直到触发我们在 HttpClient 上设置的任何超时 -> Tieout 异常。换句话说,看起来服务器发送的响应被“忽略”并且组件等待超时。我们能够使用 CURL 或 Postman 从同一台机器成功发出请求,所以我怀疑它是否依赖于机器。
当然,超时时间高于服务器响应时间,我们可以确认服务器确实在处理并发送响应。
响应负载的大小不会随处理时间发生显着变化 - 似乎这里唯一的变量是处理时间本身。
有任何解决此问题的线索/想法吗?
编辑以添加代码 (.NET 4.5):
var content = new StringContent("{}", Encoding.UTF8, "application/json");
client.Timeout = TimeSpan.FromMinutes(8);
var response = client.PostAsync("https://destination.service.com/myendpoint", content).Result;
var responseString = response.Content.ReadAsStringAsync().Result;
这是我们为解决问题而创建的一个小型测试 C# 控制台应用程序的结果 - 正如您所看到的那样,真的没什么特别的。
最佳答案
我认为问题是强制 async
调用为 synchronous
会在进程中阻塞线程。该调用将需要一个线程来完成操作,由于没有线程可用,该操作将失败。
如果从 UI 线程或线程池线程调用(死锁也可能发生在主线程中),就会出现这种情况,尤其是当工作负载像您这样非常高时。
尝试异步版本:
var response = await client.PostAsync("https://destination.service.com/myendpoint", content);
var responseString = await response.Content.ReadAsStringAsync();
关于c# - 无法使 C# HttpClient 在较长的 API 响应时间内可靠地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57158629/