使用HtmlAgilityPack下載網頁時違反HTTP協議

.net c# html-agility-pack system.net.webexception

我正在嘗試從www.mediafire.com解析下載頁面,但是當我嘗試將頁面加載到HtmlDocument時,我經常會收到帶有以下消息的System.Net.WebException

服務器提交了協議違規。第= ResponseStatusLine

這是我的代碼:

HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();

HtmlAgilityPack.HtmlDocument doc = null;

string url = www.mediafire.com/?abcdefghijkl //There are many different links

try
{
    doc = web.Load(url); //From 30 links, usually only 10 load properly
}

catch (WebException)
{

}

任何想法為什麼只有30個鏈接中的10個工作(鏈接每次都改變,因為我的程序是“搜索引擎”)以及我如何解決問題?

當我在瀏覽器中加載這些網站時,一切正常。


我試圖將以下行添加到我的app.config中,但這也無濟於事

HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();

HtmlAgilityPack.HtmlDocument doc = null;

string url = www.mediafire.com/?abcdefghijkl //There are many different links

try
{
    doc = web.Load(url); //From 30 links, usually only 10 load properly
}

catch (WebException)
{

}

一般承認的答案

這與Html Agility Pack沒有直接關係,而是與底層HTTP /套接字層有關。此錯誤表示服務器未發送回正確的HTTP狀態行。

狀態行在HTTP RFC中定義,可在此處獲得: http//www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

我引用:

響應消息的第一行是狀態行,由協議版本後跟數字狀態代碼及其關聯的文本短語組成,每個元素由SP字符分隔。除最終的CRLF序列外,不允許使用CR或LF。

   Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

您可以使用完整十六進制報告添加套接字跟踪來檢查:

   Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

這將在當前執行目錄中創建一個SocketTrace.log文件。看看那裡,協議違規應該是可見的。如果它不是太大,你可以在這裡發布:-)

不幸的是,如果你不擁有服務器,那麼你可以做的就不多了(如果你已經添加了useUnsafeHeaderParsing設置,這很好)但在這些情況下優雅地失敗了。


熱門答案

將keep alive屬性設置為false將解決此問題。但我不確定htmlagilitypack是否具有此屬性。所以使用WebClient將是一個更好的選擇。

這對我有用。而不是使用web.Load直接加載網址,而是使用自定義WebClient下載所需網址的html。在您的自定義WebClient重寫GetWebRequest方法中,使HttpWebRequest.KeepAlive = false。現在將下載的文件加載到web.Load()中。

MyWebClient client = new MyWebClient();
client.DownloadFile(searchURL, @"C:\\index.html");
var doc = web.Load("C:\\index.html");

覆蓋GetWebRequest

MyWebClient client = new MyWebClient();
client.DownloadFile(searchURL, @"C:\\index.html");
var doc = web.Load("C:\\index.html");



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因