2010-07-12 139 views
3

我是C#中的新成員,並且需要從C#中檢索URL。大多數情況下它工作正常,但在一種情況下,它會拋出一個錯誤。 URL是如下 http://whois.afrinic.net/cgi-bin/whois?searchtext=41.132.178.138HttpWebRequest錯誤403

錯誤是:禁止(403):

異常在對URL的HTTP請求:http://whois.afrinic.net/cgi-bin/whois?searchtext=41.132.178.138遠程服務器返回一個錯誤。

我的代碼

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。 – 2010-07-12 19:42:09

回答

6

刪除您的ContentType線。

request.ContentType.... 

你不是在做表單文章,只用「GET」檢索頁面。

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

並且還將Accept屬性設置爲「text/html」。

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

這很好。我在添加這三行代碼之後成功完成了這個任務:'webRequest.Method =「GET」; webRequest.UserAgent =「Foo」; webRequest.Accept =「text/html」;' – swdev 2011-12-05 02:35:23

+1

儘管這篇文章已經很老了,但我今天已經投入了它,即2016年10月15日,因爲今天我在試圖學習WebScraping時也遇到過類似的問題。我在stackoverflow上發佈了這個問題,但有人指出已經有類似的問題,因此我刪除並搜索了可用的答案。上面給我的Shri Mikael Svenson給出的答案對解決我自己的問題真的很有幫助。好的@Mikael Svenson – Unnikrishnan 2016-10-15 13:11:51

4

設置

request.Accept = "text/html";
以及它會工作。

我不知道他們爲什麼配置這種方式,可能是故意阻止一些機器人。您可能想要檢查他們的服務條款,無論您是否可以自動查詢他們的網站。


編輯補充:仍然相信我的答案在這種情況下是正確的,我可以重現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(); 
    } 
}