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 回答