【问题标题】:Test for open port before attempting HttpClient connection在尝试 HttpClient 连接之前测试开放端口
【发布时间】:2013-04-09 14:00:52
【问题描述】:

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

我宁愿不依赖捕获异常来处理这种情况,尤其是因为这些方法会抛出 AggregateException,然后我必须对其进行筛选。

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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
    }
    

    【讨论】:

    • 感谢您的回答,不幸的是,这仍然取决于捕获程序逻辑的异常,并且在我检查开放端口和尝试连接之间仍然存在竞争条件。我仍在寻找一种方法来挂钩实际的 HTTP 连接尝试并在那里捕获故障,但如果我找不到这样做的方法,我会接受这个答案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多