【发布时间】:2018-02-14 15:13:59
【问题描述】:
我一直在开发一个确定网页信息的应用程序。其中一个组件涉及向 URL 发出 HTTP GET 请求,获取 HTML 并对其进行分析。这对我抛出的每个 URL 都有效,除了一个......
罪魁祸首是 .NET HttpClient,它似乎总是在请求问题域中的任何 URL 时超时。但是,浏览器请求的相同 URL 会在几毫秒内返回内容。标题似乎没有什么不寻常的地方。
延长超时时间只会导致需要更长的时间来进行爆破。我已经尝试了几分钟,结果相同。我尝试了各种方法,例如将用户代理字符串设置为 Chrome 的字符串,但无济于事。
有问题的域是:http://careers.adidas-group.com 请注意,同一站点也在https://careers.adidas-group.com 的 HTTPS 上运行(它具有有效的证书)。 使用任一协议都会导致相同的错误。
我可以用一个简单的 C# 控制台应用程序来显示问题,如下所示:
static void Main(string[] args)
{
string url = "http://careers.adidas-group.com";
var client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(10)
};
using (var message = new HttpRequestMessage(HttpMethod.Get, url))
{
using (var httpResponse = Task.Run(() => client.SendAsync(message)).Result)
{
Console.WriteLine("{0}: {1}", httpResponse.StatusCode, httpResponse.ReasonPhrase);
}
}
Console.ReadLine();
}
请注意,在上面的示例中,我将超时设置为 10 秒,只是为了加快解决问题的速度 - 但是,增加超时没有任何区别。
具有不同 URL(例如 https://stackoverflow.com/)的相同代码运行良好。
另请注意,上面的代码已简化为作为控制台应用程序运行。我的实际代码在异步 MVC 控制器方法中异步正确运行(使用等待) - 我只是使用 Task.Run(() => ) 使其与示例中的同步 Main 方法的上下文一起工作。但这对结果没有任何影响。 (实际的例外是“任务已取消”,但这似乎是超时的症状,而不是实际问题)。
谁能向我解释为什么会发生这种情况(与服务器配置有关吗?)以及我可以做些什么来使 HttpClient 满足请求?谢谢。
【问题讨论】:
-
会是用户代理头吗?
-
@JulianReschke 不,我没有,但有趣的是,使用该工具也会出现同样的超时问题。服务器必须拒绝“机器人”,但我不清楚什么标准。
-
与 curl 的结果相同
-
@maccettura 这是我最初的想法之一,但我尝试在一些流行的浏览器代理的请求中设置
user-agent字符串,但没有任何区别。
标签: c# http asynchronous timeout dotnet-httpclient