0

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 ミリ秒しかかからないのはなぜですか?

4

0 に答える 0