在尝试HttpClient连接之前测试开放端口

时间:2013-04-09 14:00:52

标签: c# .net .net-4.5 dotnet-httpclient

HttpClient类(GetAsync等)的各种方法接受Uri对象或字符串,并尝试打开指定位置的连接。但是,在我的情况下,远程主机很可能没有监听(端口已关闭,将被主动拒绝;它在我们的局域网内)。

我宁愿不依赖于捕获异常来处理这种情况,特别是因为这些方法会抛出AggregateException,然后我必须筛选它。

有没有更好的方法来检测这种情况,同时仍然可以获得HttpClient类的好处(远程主机是WebApi服务)?我应该使用像TcpClient这样的东西检查端口是否正在监听?当然,这涉及到电话之间的竞争条件。我希望带有HttpMessageHandler的构造函数重载会有所帮助,但WebRequestHandler中的任何内容都不会向我跳出来......

1 个答案:

答案 0 :(得分: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
}