- PR -

HttpWebRequestのリトライ

投稿者投稿内容
みゅーたん
常連さん
会議室デビュー日: 2005/04/28
投稿数: 31
投稿日時: 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);
}
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-05-25 15:33
こんな感じ?
コード:

int ErrorCount = 0
while(true)
{
    try
    {
        (略)
    }
    catch(System.Net.WebException WebException)
    {
        if (++ErrorCount > 3)
        {
            throw(WebException);
        }
        System.Threading.Thread.Sleep(20000);
    }
}



おっと成功したら無限LOOPだw
適当に脱出してちょ

[ メッセージ編集済み 編集者: Yam 編集日時 2006-05-25 15:35 ]
みゅーたん
常連さん
会議室デビュー日: 2005/04/28
投稿数: 31
投稿日時: 2006-05-25 18:17
Yam様ご回答ありがとうございます。

実行したところ3回目のループで
'System.InvalidOperationException' のハンドルされていない例外が system.dll で発生しました。
追加情報 : 以前の呼び出しの処理中に BeginGetRequestStream/BeginGetResponse を再度呼び出すことはできません。

というエラーが出てしまいました。
どうしたら回避できるでしょうか?
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-05-26 10:22
確実にCloseする為にfinallyを使いませう。
コード:
	try
	{
		(略)
	}
	catch()
	{
		(略)
	}
	finally
	{
        sr.Close(); 
        resStream.Close(); 
	}


みゅーたん
常連さん
会議室デビュー日: 2005/04/28
投稿数: 31
投稿日時: 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 で発生しました。

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。

解決策をご教授ください。
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2006-05-26 11:46
まゆりんです。

引用:

みゅーたんさんの書き込み (2006-05-26 11:31) より:

解決策をご教授ください。



Visual Studio を使用していれば
デバッグして調べてみてください。



_________________
まゆりん @ わんくま同盟
Blog る。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-05-26 13:29
確かにコードを省略しすぎたかも知れませんが...orz
みゅーたん
常連さん
会議室デビュー日: 2005/04/28
投稿数: 31
投稿日時: 2006-05-26 14:32
すいません・・・。
まゆりんさんのおっしゃっていた通り,デバッグしてみたのですが

reqStream = req.GetRequestStream();

この部分で

'System.InvalidOperationException' のハンドルされていない例外が system.dll で発生しました。
追加情報 : 以前の呼び出しの処理中に BeginGetRequestStream/BeginGetResponse を再度呼び出すことはできません。

と出たので、
finallyで
reqStream.Close();
を行ったところ、
オブジェクト参照がオブジェクト インスタンスに設定されていません。
というエラーが出ています。

先ほどの私の質問と同じことを書いてしまっているのかもしれませんが・・・。
申し訳ありません。どうしたらよいのか教えてください。

スキルアップ/キャリアアップ(JOB@IT)