2011-06-04 2 views
0

Я делаю приложение для желтого стола на рабочем столе. Я могу получить доступ ко всем странам желтого сайта, но не к австралийскому сайту. Я не знаю почему?Недоступный сайт доступа с использованием метода webclient ..?

Вот код

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 веб-сайта для австралийскому сайта я получаю пустой. Я даже попробовал httpwebrequest.

Вот Yellowpage австралиец сайт: http://www.yellowpages.com.au

Заранее спасибо

+0

Не знаю, почему. Какие ошибки/исключения вы получаете? – Oded

+0

Я не гоял никаких ошибок или исключений – Ajit

+0

Если вы отправляете код, разместите свой настоящий код, а не то, что даже не будет компилироваться. – svick

ответ

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; 
+0

Я попробовал вышеуказанный метод, он не сработает – Ajit

+0

Обновлен мой ответ. – bkaid

+0

, спасибо за работу – Ajit

0

При просмотре передачи с этого сайта в Wireshark, он говорит, что это сформированный пакет HTTP. В нем говорится, что он использует chunked transfer, а затем говорит, что следующий фрагмент имеет 0 байт, а затем отправляет код веб-сайта. Вот почему возвращает пустую строку (не null). И я думаю, что это правильное поведение.

Кажется, браузеры игнорируют эту ошибку, и поэтому они могут отображать страницу правильно.

EDIT:

Как bkaid отметил, сервер, кажется, для обработки отправить правильный ответ, являющийся файл. Следующий код работает для меня:

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(); 
+0

Да .. Я видел переданный канал, и он говорит, что длина контента 0, когда я просматривал веб-ответ через режим отладки в визуальной студии. Он говорит, что длина содержимого -1 и не показывает кодировку содержимого. Поэтому я не понял, что там происходит. В любом случае спасибо, что это сработало. – Ajit

1

В дополнение к @ bkaid правильно (и upvoted) ответ, вы можете использовать свой собственный класс, унаследованный от WebClient распаковывать/ручка сжатия сжимал 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"); 
+0

Интересно, я не знал, что вы можете это сделать. – svick

Смежные вопросы