2

www.mediafire.comからダウンロードページを解析しようとしSystem.Net.WebExceptionていますが、ページをにロードしようとすると、次のメッセージが表示されることがよくありHtmlDocumentます。

サーバーがプロトコル違反をコミットしました。Section = 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に次の行を追加しようとしましたが、それも役に立ちません

<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>
4

2 に答える 2

3

これは、Html Agility Packに直接関係するのではなく、基盤となるHTTP/ソケットレイヤーに関係します。このエラーは、サーバーが正しいHTTPステータス行を返送していないことを意味します。

ステータス行は、 http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.htmlで入手可能なHTTPRFCで定義されています。

私は引用します:

応答メッセージの最初の行はStatus-Lineであり、プロトコルバージョンと、それに続く数値のステータスコードとそれに関連するテキストフレーズで構成され、各要素はSP文字で区切られています。最終的なCRLFシーケンスを除いて、CRまたはLFは許可されません。

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

これを確認するには、完全な16進レポートを使用してソケットトレースを追加できます。

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

これにより、現在実行中のディレクトリにSocketTrace.logファイルが作成されます。そこを見てください、プロトコル違反が見えるはずです。大きすぎない場合は、ここに投稿できます:-)

残念ながら、サーバーを所有していない場合、できることはあまりありませんが(useUnsafeHeaderParsing設定を既に追加している場合は、これは適切です)、これらの場合は正常に失敗します。

于 2011-01-11T13:07:57.433 に答える