Violazione del protocollo HTTP durante il download di pagine Web tramite HtmlAgilityPack

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

Domanda

Sto cercando di analizzare le pagine di download da www.mediafire.com, ma molto spesso ottengo un System.Net.WebException con il seguente messaggio, quando provo a caricare una pagina su un HtmlDocument :

Il server ha commesso una violazione del protocollo. Sezione = ResponseStatusLine

Questo è il mio codice:

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)
{

}

Qualche idea sul perché funzionano solo 10 di 30 link (i link cambiano ogni volta, perché il mio programma è un "motore di ricerca") e come posso risolvere il problema?

Quando carico questi siti nel mio browser, tutto funziona correttamente.


Ho provato ad aggiungere le seguenti linee al mio app.config, ma questo non aiuta neanche

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)
{

}

Risposta accettata

Questo non è correlato direttamente al pacchetto agilità HTML, ma al livello HTTP / socket sottostante. Questo errore indica che il server non sta rinviando una riga di stato HTTP corretta.

La riga di stato è definita in HTTP RFC disponibile qui: http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

Quoto:

La prima riga di un messaggio di risposta è la Status-Line, costituita dalla versione del protocollo seguita da un codice di stato numerico e dalla frase testuale associata, con ciascun elemento separato dai caratteri SP. Nessun CR o LF è consentito tranne nella sequenza CRLF finale.

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

È possibile aggiungere tracce di socket con report esadecimale completo per verificare che:

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

Questo creerà un file SocketTrace.log nella directory di esecuzione corrente. Dai un'occhiata qui, la violazione del protocollo dovrebbe essere visibile. Puoi postarlo qui se non è troppo grande :-)

Sfortunatamente, se non possiedi il server, non puoi fare molto (se hai già aggiunto l'impostazione useUnsafeHeaderParsing, che è buona) ma fallisci con grazia in questi casi.


Risposta popolare

L'impostazione di mantenere la proprietà alive su false risolverà questo problema. Ma non sono sicuro che htmlagilitypack abbia questa proprietà. Quindi usare WebClient sarebbe un'alternativa migliore.

Questo ha funzionato per me. Invece di caricare direttamente l'url con web.Load, scarica l'html dell'URL desiderato usando il tuo WebClient personalizzato. Nel tuo WebClient personalizzato, sostituisci il metodo GetWebRequest per rendere HttpWebRequest.KeepAlive = false. Ora carica il file scaricato in web.Load ().

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

Overriding GetWebRequest

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché