3

HttpClientクラスのさまざまなメソッド(GetAsync など) は、Uri オブジェクトまたは文字列を受け取り、指定された場所への接続を開こうとします。ただし、私の場合、リモートホストがリッスンしていない可能性が非常に高いです(ポートが閉じられており、積極的に拒否されます。LAN内にあります)。

特に、これらのメソッドがAggregateExceptionをスローしてからふるいにかける必要があるため、このシナリオを処理するために例外をキャッチすることに依存したくありません。

HttpClient クラス (リモート ホストは WebApi サービス) の利点を活用しながら、このシナリオを検出するより良い方法はありますか? TcpClient などを使用して、ポートがリッスンしているかどうかを事前に確認する必要がありますか? もちろん、これには呼び出し間の競合状態が含まれます。HttpMessageHandler を受け取るコンストラクターのオーバーロードが役立つことを願っていますが、WebRequestHandlerには何も飛び出していません...

4

1 に答える 1

3

を使用できます。Socket.Connect(string host, int port)

    private static bool TestForOpenHttpPort(string host)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            s.Connect(host, 80);
            return true;
        }
        catch (SocketException)
        {
            return false;
        }
        finally
        {
            ((IDisposable)s).Dispose();
        }
    }

簡単な使い方:

if (TestForOpenHttpPort("google.com"))
{
    // socket is open
}
于 2013-04-09T14:12:51.997 に答える