WebRequest からの応答を取得しようとする最も基本的なコードがあります。タイムアウトを 500 ミリ秒 (これで十分です) に設定し、応答を取得します。リクエストがタイムアウトしたかどうかの情報を返します。VPN 経由で IIS を実行しているサーバーに接続されているコンピューターからこのコードを実行すると、すべて正常に動作します。このコードは「OK.」を返します。IIS サーバーで同じコードを実行すると、"Timed out." が返されます。いつも。
コンピューターでこのコードを実行し、IIS サーバー マシンの InternetExplorer でこの URI をテストすることにより、URI が有効であることを再確認しました。
Pulse.aspx ファイルは、1 文字の「1」を含む単純なテキスト ファイルです。コードで提供した URI を介してアクセスできます。
IIS を実行しているマシンは、最新の更新プログラムがすべてインストールされた Windows 2008 Server です。
興味深いのは、「タイムアウト」というメッセージです。500ms ではなく 2000ms を超えてから表示されるため、通常のタイムアウトではありません。私のコンピューターでは、タイムアウト値を 100 ミリ秒に設定できますが、タイムアウトになりますが、すぐに発生します (実際の 100 ミリ秒後)。
通常のユーザーと管理者ユーザーとしてテスト コードを実行しようとしました。喜びはありません。
私は何を間違っていますか?このコードを IIS サーバーから実行する必要があります (IIS のクラッシュを検出するウォッチドッグ/パルス サービスの一部です)。
完全なコードは次のとおりです。
using System;
using System.Net;
namespace ConsoleApplication1 {
class Program {
private static bool CheckForTimeout(Uri uri, int timeout) {
var status = false;
var req = WebRequest.Create(uri);
req.Method = "GET";
req.Timeout = timeout;
WebResponse res = null;
try {
res = req.GetResponse();
} catch (WebException x) {
status = x.Status == WebExceptionStatus.Timeout;
} finally {
if (res != null) res.Close();
}
return status;
}
static void Main(string[] args) {
if (CheckForTimeout(new Uri("http://192.168.1.11/Pulse.aspx"), 500))
Console.WriteLine("Timed out.");
else
Console.WriteLine("OK.");
}
}
}
更新:タイムアウトを 5000 に変更した後、動作するようになりました! しかし、それはまだ非常に奇妙です。リモート ホストからコードを実行するのに 300 ミリ秒しかかからず、localhost から同じコードを実行するのに 5000 ミリ秒しかかからないのはなぜですか?