在尝试建立HttpClient连接之前,先测试端口是否开放。

3
HttpClient类的各种方法(如GetAsync等)接受一个Uri对象或字符串,并尝试打开到指定位置的连接。然而,在我的情况下,远程主机很可能没有在监听(端口关闭并将被积极拒绝;它在我们的局域网中)。
我不想依赖捕获异常来处理这种情况,特别是因为这些方法抛出 AggregateException,然后我必须筛选它们。
是否有更好的方法来检测这种情况,同时仍然获得HttpClient类的好处(远程主机是WebApi服务)?我应该使用像TcpClient这样的东西事先检查端口是否正在监听吗?当然,这涉及到调用之间的竞争条件。我希望构造函数重载,它需要一个HttpMessageHandler,但WebRequestHandler中没有任何提示...
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
}

1
谢谢你的回答,不幸的是这仍然依赖于捕获程序逻辑的异常,并且在我检查开放端口和尝试连接之间仍存在竞争条件。我仍在寻找一种方法来钩入实际的HTTP连接尝试并在那里捕获失败,但如果我找不到这样的方法,我将接受这个答案... - Tobias J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接