Frage

Ich versuche zu Parse Download-Seiten von www.mediafire.com, aber ich bekomme wirklich oft eine System.Net.WebException mit der folgenden Meldung, wenn ich versuche, eine Seite zu einem HtmlDocument zu laden:

Der Server verpflichtet, ein Protokoll Verstoß. Section = ResponseStatusLine

Dies ist mein Code:

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

}

Irgendwelche Ideen, warum nur 10 von 30 Links Arbeit (die Links ändern, jedes Mal, weil mein Programm ist ein „Suchmaschine“) und wie kann ich das Problem lösen?

Wenn ich diese Seiten in meinem Browser laden, funktioniert alles einwandfrei.


Ich habe versucht, die folgenden Zeilen zu meinem app.config hinzufügen, aber das nicht hilft entweder

<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>
War es hilfreich?

Lösung

Dies ist nicht auf die Html Agility Pack einfach direkt verwandt ist, sondern vielmehr auf den zugrunde liegenden HTTP / Socket Layer. Dieser Fehler bedeutet, dass der Server sendet wieder keine korrekte HTTP-Statuszeile.

Die Statuszeile ist definiert in HTTP RFC finden Sie hier: http: // www .w3.org / Protokolle / RFC2616 / RFC2616-sec6.html

Ich zitiere:

Die erste Zeile einer Antwortnachricht ist die Status-Zeile, von der aus Protokollversion, gefolgt von einem numerischen Statuscode und der dazugehörige Text Begriff, wobei jedes Element getrennt durch SP-Zeichen. Keine oder CR LF zulässig außer in der letzten CRLF-Sequenz.

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

Sie können Socket-Spuren mit voller Hex-Bericht hinzufügen, um dies zu überprüfen:

<configuration>
    <system.diagnostics>
        <sources>
            <source name="System.Net.Sockets" tracemode="includehex">
                <listeners>
                    <add name="System.Net.Sockets" type="System.Diagnostics.TextWriterTraceListener" initializeData="SocketTrace.log" />
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="System.Net.Sockets" value="Verbose"/>
        </switches>
        <trace autoflush="true" />
    </system.diagnostics>
</configuration>

Dies wird eine SocketTrace.log Datei im aktuellen Ausführung Verzeichnis erstellen. Werfen Sie einen Blick in es, sollte die Protokollverletzung sichtbar sein. Sie können es hier posten, wenn es nicht zu groß ist: -)

Leider, wenn Sie den Server nicht besitzen, gibt es nicht viel Sie tun können (wenn Sie bereits die UseUnsafeHeaderParsing Einstellung hinzugefügt, was gut ist), aber anmutig in diesen Fällen nicht.

Andere Tipps

Einstellung keep alive-Eigenschaft auf false wird dieses Problem beheben. Aber ich bin nicht sicher, ob htmlagilitypack diese Eigenschaft hat. So WebClient wäre eine bessere Alternative.

Das ist für mich gearbeitet. Statt direkt die URL mit web.Load Laden, laden Sie die HTML der gewünschten URL Ihrer benutzerdefinierten WebClient verwenden. In Ihrer benutzerdefinierten WebClient Überschreibung GetWebRequest Methode, um HttpWebRequest.KeepAlive = false. Jetzt laden Sie die heruntergeladene Datei in web.Load ().

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

Übergeordnete GetWebRequest

using System;
using System.Net;

namespace MyProject
{
    internal class CustomWebClient : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            if (request is HttpWebRequest)
            {
                (request as HttpWebRequest).KeepAlive = false;
            }
            return request;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top