リクエストを再試行した後、POST データが何らかの形で失われるという問題に直面しました。以下のコードサンプル。( request.timeout = 1 は、以下のコードに示されている動作を再現するためのテスト目的で設定されていることに注意してください):
//post_data_final getting
private void request_3()
{
for(int i=1; i<=5; i++)
{
byte[] byteArray = Encoding.ASCII.GetBytes(post_data_final);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(site_URI);
request.Method = "POST";
//some headers info
request.Timeout = 1;
request.ContentLength = byteArray.Length;
using (Stream os = request.GetRequestStream())
{
os.Write(byteArray, 0, byteArray.Length);
}
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//some code about response
}
catch (WebException wex)
{
if (wex.Status == WebExceptionStatus.Timeout)
{
continue;
}
//some additional checks
}
}
}
魔法は、最初のリクエスト (リクエスト タイムアウト エラーまで) がうまくいくことです。以降のリクエストはPOST データなしで行われますが、コンテンツの長さは適切にカウントされます (つまり、前のリクエストと同じままです)。
更新しました:
- post_data_final の取得は別の関数です。これは (byteArray を除いて) 使用されないか、request_3() 関数で変更されます。
- for ループに入ってタイムアウト例外が発生していなければ、リクエストは正常に機能します。したがって、リクエストを for ループに入れると、特定の数の有効なリクエストが実行されます。タイムアウト例外が発生するとすぐに、次のリクエストは POST データなしになります。
- ソースコードは、再帰は悪い考えだと思う人のために編集されています。編集したコードはまだ機能しません。
どんな提案でも大歓迎です