我正在制作桌面黄页应用程序。我可以访问所有国家的黄页网站,但不能访问澳大利亚网站。我不知道为什么?
这是代码
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
提前致谢
答案 0 :(得分:3)
看起来该网站只会发送过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;
答案 1 :(得分:1)
除了@ bkaid的正确(和upvoted)答案,你可以使用你自己的继承自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");
答案 2 :(得分:0)
当我在Wireshark中查看该网站的转移时,它表示这是一个格式错误的HTTP数据包。它说它使用chunked transfer,然后说下面的块有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();