为什么我通过 HttpClient 调用 API 时服务器超时,但 Postman 没问题?
Why do I get a server timeout calling an API via HttpClient but Postman is fine?
我正在尝试向 RESTful 服务发出 GET
请求,但是 .NET HttpClient
收到超时,但是通过 Postman 这个 returns 是预期的秒内响应(错误响应,因为我还没有“登录”)。
我尝试过的:
- 我已经检查过这些 URL 是一样的。
- 我想也许 Postman 的自动 headers 是问题所在,但在
HttpClient
中设置这些后,我仍然收到超时。
- 如果我增加
HttpClient
上的超时,我仍然会从服务器 ((504) Gateway Timeout
) 上收到超时。
Client = new HttpClient(new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip
});
var objTask = Client.GetStringAsync(objUrl);
objTask.Wait();
strResponse = objTask.Result;
strResponse = Client.GetStringAsync(objUrl).Result;
为什么我通过 HttpClient 收到超时?
注:
我们的 WebApi 正在调用我们的 WCF 服务,后者又通过 HttpClient 调用第三方 RESTful 服务---出于安全原因,我不能直接从中调用第三方 API我们的 WebApi 控制器。网站基于.NET 4.0 Framework。
在@jdweng 和@gunr2171 的大量帮助下,我意识到问题是由于存储在自托管 WCF 服务 App.Config
中的代理造成的。如果我将其注释掉,我就不会遇到超时问题。
HttpClient
构造函数可以接受一个 HttpClientHandler
,其中有一个 Proxy
属性,您可以在其中绕过本地代理:
return new HttpClient(new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip,
Proxy = new WebProxy()
{
BypassProxyOnLocal = true
}
})
{
BaseAddress = new Uri("https:\my.service")
};
我正在尝试向 RESTful 服务发出 GET
请求,但是 .NET HttpClient
收到超时,但是通过 Postman 这个 returns 是预期的秒内响应(错误响应,因为我还没有“登录”)。
我尝试过的:
- 我已经检查过这些 URL 是一样的。
- 我想也许 Postman 的自动 headers 是问题所在,但在
HttpClient
中设置这些后,我仍然收到超时。 - 如果我增加
HttpClient
上的超时,我仍然会从服务器 ((504) Gateway Timeout
) 上收到超时。
Client = new HttpClient(new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip
});
var objTask = Client.GetStringAsync(objUrl);
objTask.Wait();
strResponse = objTask.Result;
strResponse = Client.GetStringAsync(objUrl).Result;
为什么我通过 HttpClient 收到超时?
注:
我们的 WebApi 正在调用我们的 WCF 服务,后者又通过 HttpClient 调用第三方 RESTful 服务---出于安全原因,我不能直接从中调用第三方 API我们的 WebApi 控制器。网站基于.NET 4.0 Framework。
在@jdweng 和@gunr2171 的大量帮助下,我意识到问题是由于存储在自托管 WCF 服务 App.Config
中的代理造成的。如果我将其注释掉,我就不会遇到超时问题。
HttpClient
构造函数可以接受一个 HttpClientHandler
,其中有一个 Proxy
属性,您可以在其中绕过本地代理:
return new HttpClient(new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip,
Proxy = new WebProxy()
{
BypassProxyOnLocal = true
}
})
{
BaseAddress = new Uri("https:\my.service")
};