无法使用webclient方法访问网站..?

时间:2011-06-04 18:12:21

标签: c#

我正在制作桌面黄页应用程序。我可以访问所有国家的黄页网站,但不能访问澳大利亚网站。我不知道为什么?

这是代码

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

提前致谢

3 个答案:

答案 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();