2010-07-12 5 views
3

Я новичок в C# и имею требование получить URL-адрес от C#. В большинстве случаев он работает нормально, но в одном случае он выдает ошибку. URL-адрес выглядит следующим образом http://whois.afrinic.net/cgi-bin/whois?searchtext=41.132.178.138Ошибка HttpWebRequest 403

Ошибка:

Исключение в запросе HTTP для URL: http://whois.afrinic.net/cgi-bin/whois?searchtext=41.132.178.138 Удаленный сервер возвратил ошибку: (403) Запрещенный.

Мой код в

void MyFUnction(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

    request.UserAgent = ".NET Framework Test Client"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    Logger.WriteMyLog("application/x-www-form-urlencoded"); 


    // execute the request 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    // we will read data via the response stream 
    Stream resStream = response.GetResponseStream(); 

    string tempString = null; 
    int count = 0; 
    do 
    { 
     // fill the buffer with data 
     count = resStream.Read(buf, 0, buf.Length); 

     // make sure we read some data 
     if (count != 0) 
     { 
      // translate from bytes to ASCII text 
      tempString = Encoding.ASCII.GetString(buf, 0, count); 
      if (httpData == null) 
       httpData = tempString; 
      else 
       httpData += tempString; 

     } 
    } 
    while (count > 0); // any more data to read? 
} 
+0

для форматирования коды, выберите его в редакторе, и нажмите Control-K. –

ответ

6

Удалите ContentType линию.

request.ContentType.... 

Вы не делаете сообщение в форме, но только получаете страницу с помощью «GET».

request.Method = "GET"; //this is the default behavior 

А также установить свойство Accept в текст/html.

request.Accept = "text/html"; 
+0

это приятно. Мне удалось это сделать, добавив три инициализации строк: «webRequest.Method =« GET »; webRequest.UserAgent = "Foo"; webRequest.Accept = "text/html"; ' – swdev

+1

Хотя этот пост довольно стар, я сегодня его поддержал, т. Е. 15 октября 2016 года, потому что сегодня я столкнулся с аналогичной проблемой при попытке изучить Webscraping. Я отправил проблему в stackoverflow, но кто-то указал, что есть аналогичный вопрос, и, следовательно, я удалил и снова просмотрел уже имеющиеся ответы. Ответ, приведенный выше, мой Шри Микаэль Свенсон был действительно полезен для решения моей собственной проблемы. Хорошо @ Микаэль Свенсон – Unnikrishnan

4

request.Accept = "text/html";
, а также он будет работать.

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


Edited добавить: Тем не менее уверен, что мой ответ был правильным в этом случае, я могу воспроизвести 403 каждый раз, если я не установлю заголовок Accept. ContentType является излишним, но не вредным.
В любом случае, вы также хотите изменить свою функцию, чтобы правильно расположить ответ, и прочитать ответ с правильной кодировкой символов:

void MyFunction(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.UserAgent = ".NET Framework Test Client"; 
    request.Accept = "text/html"; 
    Logger.WriteMyLog("application/x-www-form-urlencoded"); 

    // execute the request 
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    { 
     // we will read data via the response stream 
     Stream resStream = response.GetResponseStream(); 
     StreamReader streamReader = new StreamReader(
             resStream, 
             Encoding.GetEncoding(response.CharacterSet) 
            ); 
     httpData = streamReader.ReadToEnd(); 
    } 
} 
Смежные вопросы