- - PR -
HttpWebRequestのリトライ
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-05-25 14:03
たびたびお世話になります。
C#でHttpWebRequestでデータを送信しようとしたときに、 送信先につながらない場合、WAITして3回リトライしてから エラーを出したいと思っています。 どのようにリトライすればいいのかまったく検討がつきません。 どなたかご教授ください。 現在のソースは、以下のようになっています リトライせずにWAITしてエラーを投げています。 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = data.Length; try { // ポスト・データの書き込み Stream reqStream = req.GetRequestStream(); reqStream.Write(data, 0, data.Length); reqStream.Close(); // レスポンスの取得と読み込み WebResponse res = req.GetResponse(); Stream resStream = res.GetResponseStream(); StreamReader sr = new StreamReader(resStream, enc); string html = sr.ReadToEnd(); sr.Close(); resStream.Close(); } catch(System.Net.WebException WebException) { System.Threading.Thread.Sleep(20000); throw(WebException); } | ||||
|
投稿日時: 2006-05-25 15:33
こんな感じ?
おっと成功したら無限LOOPだw 適当に脱出してちょ [ メッセージ編集済み 編集者: Yam 編集日時 2006-05-25 15:35 ] | ||||
|
投稿日時: 2006-05-25 18:17
Yam様ご回答ありがとうございます。
実行したところ3回目のループで 'System.InvalidOperationException' のハンドルされていない例外が system.dll で発生しました。 追加情報 : 以前の呼び出しの処理中に BeginGetRequestStream/BeginGetResponse を再度呼び出すことはできません。 というエラーが出てしまいました。 どうしたら回避できるでしょうか? | ||||
|
投稿日時: 2006-05-26 10:22
確実にCloseする為にfinallyを使いませう。
| ||||
|
投稿日時: 2006-05-26 11:31
たびたびすいません。
以下のようなコードに直しました。 while(true) { Stream reqStream; StreamReader; try { // ポスト・データの書き込み reqStream = req.GetRequestStream(); reqStream.Write(data, 0, data.Length); reqStream.Close(); // レスポンスの取得と読み込み WebResponse res = req.GetResponse(); Stream resStream = res.GetResponseStream(); sr = new StreamReader(resStream, enc); string html = sr.ReadToEnd(); sr.Close(); resStream.Close(); return html; } catch(System.Net.WebException WebException) { if (++ErrorCount > 3) { throw(WebException); } System.Threading.Thread.Sleep(20000); } finally { sr.Close(); reqStream.Close(); } } 次のようなエラーが出てしまいました。 'System.NullReferenceException' のハンドルされていない例外が ConsoleApplication3.exe で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 解決策をご教授ください。 | ||||
|
投稿日時: 2006-05-26 11:46
まゆりんです。
Visual Studio を使用していれば デバッグして調べてみてください。 _________________ まゆりん @ わんくま同盟 Blog る。 | ||||
|
投稿日時: 2006-05-26 13:29
確かにコードを省略しすぎたかも知れませんが...orz
| ||||
|
投稿日時: 2006-05-26 14:32
すいません・・・。
まゆりんさんのおっしゃっていた通り,デバッグしてみたのですが reqStream = req.GetRequestStream(); この部分で 'System.InvalidOperationException' のハンドルされていない例外が system.dll で発生しました。 追加情報 : 以前の呼び出しの処理中に BeginGetRequestStream/BeginGetResponse を再度呼び出すことはできません。 と出たので、 finallyで reqStream.Close(); を行ったところ、 オブジェクト参照がオブジェクト インスタンスに設定されていません。 というエラーが出ています。 先ほどの私の質問と同じことを書いてしまっているのかもしれませんが・・・。 申し訳ありません。どうしたらよいのか教えてください。 |