0

HTTPWebRequest を使用して (JSON を返す) API を呼び出す Windows サービスを作成しました。

API は、「配信」するものがあるまで何も返しません。そのため、タイムアウトを非常に高く設定し、応答を受信するまで要求を待機させます。

問題は、API を実行しているサーバーをオフまたは切断することをテストするときです。HTTPWebRequest はリクエストを停止しません。そのため、API サーバーがダウンしたかどうかはわかりません。

リクエストコード:

HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(Url);
Request.Method = "POST";
Request.ContentType = "application/x-www-form-urlencoded";
Request.ContentLength = PostData.Length;
Request.Timeout = Timeout;
Request.KeepAlive = true;
using (StreamWriter sw = new StreamWriter(Request.GetRequestStream()))
{
    sw.Write(PostData);
}
using (HttpWebResponse Response = (HttpWebResponse)Request.GetResponse())
{
    using (StreamReader sr = new StreamReader(Response.GetResponseStream()))
    {
        ResponseText = sr.ReadToEnd();
    }
}

要求されたサーバーがダウンしたときに要求を「中断」する方法はありますか? Web ブラウザーを使用して API サーバーを呼び出してみましたが、しばらくして切断すると、Web ページにエラーが返されます。

4

2 に答える 2

1

要求を非同期に保つことは常に良いことです (HttpWebRequest の BeginXXX メソッドを参照してください - http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx )。非同期 API を使用すると、サーバーから応答を受け取るまでブロックされません。

非同期 API の使用に加えて、ハートビート リクエスト (サーバー上の ping サービスへの HEAD HTTP リクエストであり、空の本文と HTTP 200 ステータスを返す可能性があります) を使用して、サーバーの状態を追跡できます。生きている。このリクエストがタイムアウトした場合、サーバーは動作していません。この場合、キャンセルするか、リクエストが行われたことを単に「忘れる」ことができます。

于 2012-11-08T08:56:14.117 に答える
1

サーバーがオンラインの場合にのみバックグラウンドワーカーを使用できます。いくつかの欠点がありますが、うまく機能する可能性があります。

于 2012-11-08T08:52:05.657 に答える