【发布时间】:2017-12-17 01:38:12
【问题描述】:
我正在尝试使用 HttpClient 下载网页,这是我的代码:
private async Task<string> _doRequest(string url)
{
string result = string.Empty;
var client = HttpClient;
using(var request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Get
}){
using (HttpResponseMessage response = client.SendAsync(request).Result)
if (response.Headers.Location == null)
{
using (HttpContent content = response.Content)
{
result = await content.ReadAsStringAsync();
}
}
else
{
result = await _doRequest(response.Headers.Location.ToString());
}
};
return result;
}
HttpClient是一个静态变量,初始化如下:
var handler = new HttpClientHandler();
handler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
handler.AllowAutoRedirect = false;
HttpClient = new HttpClient(handler);
HttpClient.DefaultRequestHeaders.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");
当我尝试使用 url = "https://www.gls-italy.com/?option=com_gls&view=track_e_trace&mode=search&numero_spedizione=TE170187747&tipo_codice=nazionale" 执行代码时
我在这里迷路了。对我来说,它看起来像是一个有效的 302 位置,但由于某些原因 HttpClient 不这么认为,只是抛出一个异常。
首先要明确的是,我最初依赖 AllowAutoRedirect 默认值并推动 HttpClient 进行重定向,但它不起作用,我遇到了同样的异常,这导致我尝试自己管理它。但没有成功。
有人知道发生了什么吗?如何让它发挥作用?
提前致谢。
【问题讨论】:
-
不是 HttpClient。我已经尝试过您与 HttpWebRequest 的链接,但出现了 WebException.SendFailure。这是一个糟糕的 302 响应。连接已关闭。位置声明新地址是
https://wwwdr.(...)。如果您将www更改为wwwdr,则服务器会正确响应。 -
不回答您的问题,而是要避免在异步方法中使用
.Result的提示。它可能导致死锁。如果您等待 client.SendAsync(request),您将获得解包结果,避免死锁情况,并可能从您的线程中获得更多使用。 -
@Jimi 我知道如果我请求 wwwdr 它正在工作但他们可以改变它,我需要一种方法来遵循重定向,curl 确实遵循重定向必须有一种方法来从 c# 管理它.
-
@您可能没有明确地将协议设置为 TLS 1.2。此服务器仅使用它。所以在创建HttpRequest之前设置
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12。 -
@Jimi 我之前试过不会改变结果,这很有意义,因为我在 4.6.2 网络上。我认为问题在于连接:关闭响应。即使有连接,也必须有一种使用 HttpClient 读取响应的方法:close...
标签: c# redirect web-scraping dotnet-httpclient