在尝试 HttpClient 连接之前测试开放端口
Posted
技术标签:
【中文标题】在尝试 HttpClient 连接之前测试开放端口【英文标题】:Test for open port before attempting HttpClient connection 【发布时间】:2013-04-09 14:00:52 【问题描述】:HttpClient 类的各种方法(GetAsync 等)采用 Uri 对象或字符串并尝试打开到指定位置的连接。但是,在我的情况下,远程主机很可能没有在监听(端口已关闭并将被主动拒绝;它在我们的 LAN 内)。
我宁愿不依赖捕获异常来处理这种情况,尤其是因为这些方法会抛出 AggregateException,然后我必须对其进行筛选。
有没有更好的方法来检测这种情况,同时还能获得 HttpClient 类的好处(远程主机是 WebApi 服务)?我是否应该使用 TcpClient 之类的东西预先检查端口是否正在侦听?当然,这涉及调用之间的竞争条件。我希望采用 HttpMessageHandler 的构造函数重载会有所帮助,但 WebRequestHandler 中的任何内容都不会向我跳出...
【问题讨论】:
【参考方案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 连接尝试并在那里捕获故障,但如果我找不到这样做的方法,我会接受这个答案......以上是关于在尝试 HttpClient 连接之前测试开放端口的主要内容,如果未能解决你的问题,请参考以下文章