非常に単純な質問があります。HTTP POST を使用してサーバーにファイルをアップロードしています。問題は、接続タイムアウトを特別に処理し、タイムアウトが発生した後にサーバーを再開するための待機アルゴリズムを少し追加する必要があることです。
私のコードは非常にシンプルです:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("SomeURI");
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.KeepAlive = true;
request.Accept = "*/*";
request.Timeout = 300000;
request.AllowWriteStreamBuffering = false;
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
WebHeaderCollection headers = response.Headers;
using (Stream Answer = response.GetResponseStream())
{
// Handle.
}
}
}
catch (WebException e)
{
if (Timeout_exception)
{
//Handle timeout exception
}
}
ファイル読み取りコードは、私たちの関心事ではないため省略しました。WebException がスローされたら、例外をフィルターして、それが本当にタイムアウト例外であるかどうかを確認する必要があります。例外メッセージと比較することも考えましたが、問題のアプリケーションは商用アプリであり、メッセージが言語によって異なるのではないかと心配しているため、これが正しい方法かどうかわかりません。また、どのようなメッセージを探せばよいのでしょうか。
助言がありますか?
ベストアンサー1
ご覧になれますWebException.Status
列挙型にはフラグWebExceptionStatus
がありますTimeout
:
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
WebHeaderCollection headers = response.Headers;
using (Stream answer = response.GetResponseStream())
{
// Do stuff
}
}
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.Timeout)
{
// Handle timeout exception
}
else throw;
}
C# 6 例外フィルターを使用すると、次の場合に便利です。
try
{
var request = WebRequest.Create("http://www.google.com");
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
WebHeaderCollection headers = response.Headers;
using (Stream answer = response.GetResponseStream())
{
// Do stuff
}
}
}
catch (WebException e) when (e.Status == WebExceptionStatus.Timeout)
{
// If we got here, it was a timeout exception.
}