HttpWebRequest.GetResponse 方法卡住特定的 url

Posted

技术标签:

【中文标题】HttpWebRequest.GetResponse 方法卡住特定的 url【英文标题】:HttpWebRequest.GetResponse method stucks for specific urls 【发布时间】:2018-09-20 13:14:51 【问题描述】:

考虑以下 URL:“http://www.bestbuy.com”。此资源可在所有浏览器和所有位置快速正确地加载。

但是,此 URL 的基本 C# 代码当前卡住(任何超时都以超时结束):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

var req = WebRequest.CreateHttp("http://www.bestbuy.com");
req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
req.Timeout = 30000; // you can set any timeout

using (var resp = (HttpWebResponse)req.GetResponse()) // stucks and finally ends by timeout here

    Console.WriteLine(resp.StatusCode);
    Console.WriteLine(resp.ResponseUri.AbsoluteUri);

小提琴:https://dotnetfiddle.net/M7NZgG

相同的代码适用于大多数其他 URL。

尝试了不同的方法,但都没有帮助:

直接加载HTTPS版本(“https://www.bestbuy.com”) 删除对 UserAgent、AutomaticDecompression 和 SecurityProtocol 设置器的调用

HttpClient 类也因该资源的超时而停滞并结束。

在 Fiddler 中,响应很快被返回,但看起来很奇怪——它完全是空的:

【问题讨论】:

您是否捕获了流量并能分辨出是什么卡住了?请求发送了吗?服务器是否提供了答案? @thehennyy,是的,我愿意。在 Fiddler 中,很快就收到了响应,但看起来很奇怪——它完全是空的。我已将 Fiddler 的屏幕截图添加到描述中。 奇怪,我在 fiddler 中使用了一个工作请求,它可能与 U/A 字符串有关 - 使用你帖子中的那个它也失败了,使用我的 Firefox U/A 它也失败了,但它似乎适用于 Edge 的 U/A Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134 不确定您在此处尝试做什么,但许多知名网站会采取措施,使用各种技术来阻止页面抓取。如果它不起作用,很可能是因为百思买不希望你这样做。 @AlexK。有趣,感谢您的观察! 【参考方案1】:

我 10 代表缺少评论,这个答案应该在哪里,所以请不要投反对票,我只是想知道,你是否尝试过期望:100-继续?至少它会延迟将您的回复分成两个返回,可能会告诉您更多信息。

【讨论】:

你的意思是ServicePointManager.Expect100Continue设置吗?不出所料,这无济于事。 我的意思是作为请求中的标头。不用担心。当您卡住任何值得一试的东西时,对吗?我确实发现了这个:可能会有所帮助blogs.msdn.microsoft.com/fiddler/2011/11/05/… 此设置(ServicePointManager.Expect100Continue 或 req.ServicePoint.Expect100Continue)导致相应的标头。

以上是关于HttpWebRequest.GetResponse 方法卡住特定的 url的主要内容,如果未能解决你的问题,请参考以下文章