2011-10-23 11 views
4

私は、計算のために公開XMLフィードを使用するC#プロジェクトに取り組んでいます。私はもともとXmlDocument.Loadを使用していましたが、WebClient.DownloadStringに移行しました。include headers in my request.私がアクセスしているフィードは、通常は迅速に応答しますが、WebClientオブジェクトのタイムアウト時間内に応答することができず、例外が発生します。タイムアウトを防ぐためにWebClientを置き換えますか?

XmlDocument xmlDoc = new XmlDocument(); 

Webclient client = new WebClient(); 
client.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"; 
client.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

string data = client.DownloadString(/*URL*/); 

xmlDoc.LoadXml(data); 

私はあなたがWebクライアントのタイムアウトプロパティを変更することはできませんし、この問題を持っている人ではなく、HttpWebRequestのを使用する必要があることを読んだ:ここに私のコードです。残念なことに、私はまだ私がヘッダを使用してその結果をxmlDocに送ることができる方法でこれを実装する方法を知りません。このアプリケーションの性質上、データの受信にどれくらい時間がかかります。私はユーザーに警告することができます。

これを行う最善の方法は何ですか?

+1

'HttpWebRequest'でどんな問題がありますか? – SLaks

答えて

16

あなたは、各フェッチのためにちょうどあなたが望むタイムアウトを追加している、このためWebClient派生クラスを使用することができます。

public class TimeoutWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 
     request.Timeout = 60000; //1 minute timeout 
     return request; 
    } 
} 

あなたが今TimeoutWebClientの代わりWebClientを使用する場合は、そのタイムアウト動作を取得あなたは欲しい。必要なカスタムヘッダーがリクエストごとに同じ場合は、これらのヘッダーも追加することができ、呼び出しコードは非常にきれいなままです。

+0

ちょうど確認するために、私はあなたのコードをちょうどどこの場所にでも置くことができますし、WebClientとまったく同じTimeoutWebClientを使用しますか? – Sonic42

+0

@ Sonic42:はいいいえ – BrokenGlass

+0

webclientがIDisposableであることを追加する価値があります。TimeoutWebClientも同様です。あなたの 'を使って'を得る:) –

1
XmlDocument xmlDoc = new XmlDocument(); 

HttpWebRequest request = new (HttpWebRequest)WebRequest.Create(/*URL*/); 
request.Headers = new WebHeaderCollection(); 
// fill in request.Headers... 

// The response is presented as a stream. Wrap it in a StreamReader that 
// xmlDoc.LoadXml can accept. 
xmlDoc.LoadXml(new StreamReader(request.GetResponse().GetResponseStream()); 
0

例外をキャッチしてリクエストを再発行できます。特定の回数失敗した後で中止するには、ここにいくつかの他のロジックを入れたいかもしれません。

bool continue; 
do{ 
    continue = false;  
    try { 
     string data = client.DownloadString(/*URL*/); 
    } 
    catch (WebException e) { 
     continue = true; 
    } 
} 
while(continue); 
+0

@MystereManサーバが遅く、毎週10分に応答するとどうなりますか? –

+0

要求が成功した場合、それは無限ループを作成しませんか? – Sonic42

+0

@ L.B - 彼は通常、それは速く応答し、ときどきタイムアウトすると言いました。サーバが中止してリクエストを完了しないことがあるので、長いタイムアウトはどれくらい長く時間切れになるかを待つだけです。 –

関連する問題