gpt4 book ai didi

c# - HttpClient.PostAsJsonAsync 永远看不到帖子何时成功并响应

转载 作者:可可西里 更新时间:2023-11-01 08:37:03 26 4
gpt4 key购买 nike

我们正在使用 HttpClient 将 json 发布到 restful web 服务。在一个例子中,我们遇到了一些让我们感到困惑的事情。使用 postman、fiddler 等工具,我们可以发布到端点并查看它是否正常工作。当我们对 HttpClient.PostAsJsonAsync 做同样的事情时,我们可以在我们发布到的软件中验证它接收到的数据是否正常。但是,我们的 PostAsJsonAsync 最终总是会超时而不是给我们响应。

我们已经与创建我们正在使用的服务的团队合作,加上我们这边的额外测试,但我们还无法真正使该服务超时。

每次我们用 HttpClient 发帖时,我们就可以验证我们发帖的目标软件确实获取了数据。每当我们从任何其他工具向该目标软件发送帖子时,我们总是很快就会看到状态代码为 200 的响应。关于 HttpClient 的某些事情无法接受来自该特定服务的响应。有谁知道我们可以从这里看到什么?

这是代码(虽然它是如此千篇一律,我几乎不觉得需要它)

public string PostData(string resourcePath, Object o, Boolean isCompleteUrl = false, int timeoutMinutes = -1)
{
using (var client = new HttpClient())
{
if (timeoutMinutes > 0)
{
client.Timeout = new TimeSpan(0,timeoutMinutes,0);
}
var useUrl = isCompleteUrl ? resourcePath : ApiBase + resourcePath;
var response = client.PostAsJsonAsync(useUrl, o).Result;
if(response.StatusCode == System.Net.HttpStatusCode.OK)
{
return response.Content.ReadAsStringAsync().Result;
}
return "";
}

}

最佳答案

这个:

var response = client.PostAsJsonAsync(useUrl, o).Result;

导致代码死锁。阻塞异步 API 时通常会出现这种情况,这就是为什么您会遇到“我没有看到任何响应返回”的原因。

这是如何导致死锁的?您在包含同步上下文的环境中执行此请求的事实,可能属于 UI。它正在执行异步请求,当响应到达时,它会通过一个 IO 完成线程继续执行,该线程会尝试将延续发布到同一 UI 上下文中,该上下文当前被您的 .Result 调用阻止。

如果您想同步发出 HTTP 请求,请改用 WebClient。如果您想正确利用异步 API,请使用 await 而不是使用 .Result 进行阻止。

关于c# - HttpClient.PostAsJsonAsync 永远看不到帖子何时成功并响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30653770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com