无法使用Web客户端方法访问网站.
本文关键字:方法 访问 网站 客户端 Web | 更新日期: 2023-09-27 17:58:27
我正在制作一个桌面黄页应用程序。我可以访问所有国家的黄页网站,但不能访问澳大利亚网站。我不知道为什么?
这是代码
class Program
{
static void Main(string[] args)
{
WebClient wb = new WebClient();
wb.Headers.Add("user-agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)");
string html = wb.DownloadString("http://www.yellowpages.com.au");
Console.WriteLine(html);
}
}
对于所有其他网站,我得到澳大利亚网站的html,我得到null。我甚至还尝试了httpwebrequest。
这是黄页的澳大利亚网站:http://www.yellowpages.com.au
提前感谢
看起来该网站只会发送gzip的数据。尝试切换到HttpWebRequest并使用自动解压缩:
var request = (HttpWebRequest)WebRequest.Create("http://www.yellowpages.com.au");
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
除了@bkaid的正确答案(并投票支持)外,您还可以使用从WebClient
继承的自己的类来解压缩/处理gzip压缩的html:
public class GZipWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
request.AutomaticDecompression = DecompressionMethods.GZip |
DecompressionMethods.Deflate;
return request;
}
}
做到这一点后,以下工作很好:
WebClient wb = new GZipWebClient();
string html = wb.DownloadString("http://www.yellowpages.com.au");
当我在Wireshark中查看该网站的传输时,它说这是一个格式错误的HTTP数据包。它说它使用分块传输,然后说下面的分块有0个字节,然后发送网站的代码。这就是为什么WebClient
返回一个空字符串(而不是null
)。我认为这是正确的行为。
浏览器似乎忽略了这个错误,因此可以正确显示页面。
编辑:
正如bkaid所指出的,服务器似乎可以处理发送正确的gziped响应。以下代码适用于我:
WebClient wb = new WebClient();
wb.Headers.Add("Accept-Encoding", "gzip");
string html;
using (var webStream = wb.OpenRead("http://www.yellowpages.com.au"))
using (var gzipStream = new GZipStream(webStream, CompressionMode.Decompress))
using (var streamReader = new StreamReader(gzipStream))
html = streamReader.ReadToEnd();