2011-01-11 6 views
2

私はwww.mediafire.comからダウンロードページを解析しようとしているを使用してWebページをダウンロードし、私はHtmlDocumentにページをロードしようとすると、私は本当に多くの場合、次のメッセージとSystem.Net.WebExceptionを得るとき:HTTPプロトコル違反HtmlAgilityPack

サーバーがプロトコル 違反をコミットしました。セクション= 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) 
{ 

} 

任意のアイデア理由だけで10 30のリンク作業(私のプログラムは、「検索エンジン」であるため、リンクは、毎回の変更)とどのように私ができます問題を解決しますか?

ブラウザでこれらのサイトを読み込むと、すべて正常に動作します。


私はApp.configファイルに次の行を追加しようとしましたが、それは

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

をオーバーライド

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

。あなたは 'WebRequest'を使ってあなたのブラウザに似たリクエストを作成することができます。 – alexn

+0

多分もっと詳しいことを教えてもらえますか?チュートリアルや何かへのリンクでしょうか? – Flagbug

答えて

3

のいずれかを助けないこの直接Htmlの敏捷性パックに関連するのではなく、にされていません基本となる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 

あなたはこれをチェックするために、完全な六角レポートとソケットのトレースを追加することができます。これは、現在実行中のディレクトリにSocketTrace.logファイルを作成します

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

。そこを見て、プロトコルの違反が見えるようにする必要があります。それほど大きくない場合はここに投稿することができます:-)

残念ながら、サーバーを所有していない場合は、あまりお手伝いできません(useUnsafeHeaderParsingの設定を既に追加していれば良いですが)これらの場合は優雅に

+0

あなたができることは、サーバーの担当者に連絡し、問題を通知することです。それらに応じて、問題を解決することを決定するかもしれませんが、Simonのように、サーバーを制御できず、修復する必要はありません。 – RobV

0

キープアライブプロパティをfalseに設定すると、この問題が解決されます。しかし、htmlagilitypackにこのプロパティがあるかどうかはわかりません。だから、WebClientを使う方が良い方法でしょう。

これは私のために働いた。 web.LoadでURLを直接読み込むのではなく、カスタムWebClientを使用して目的のHTMLのhtmlをダウンロードしてください。カスタムWebClientで、GetWebRequestメソッドをオーバーライドして、HttpWebRequest.KeepAlive = falseにします。ダウンロードしたファイルをweb.Load()にロードします。彼らはおそらく非webbrowsersを検出するためのスニッフィングユーザエージェント/クッキー/ヘッダを使用している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; 
     } 
    } 
} 
+0

彼が作業しているサーバーがKeepAlive要求に問題があることを示唆していますか、 WebClientを直接使用すると問題を回避できましたか?あなたは本当に彼の問題が何であると信じているかは明言していません。 –

+0

はい、問題はサーバーからの応答です。 keep aliveをfalseに設定すると、この問題が解決されます。しかし、htmlagilitypackが生きているプロパティを保持しているかどうかはわかりません。だから、WebClientを使う方が良い方法でしょう。ありがとう! – Shami

関連する問題