在尝试HttpClient连接之前测试打开的端口
问题描述:
HttpClient类的各种方法(GetAsync等)取Uri对象或字符串并尝试打开到指定位置的连接。然而,在我的情况下,很可能是远程主机没有在监听(端口被关闭并将被主动拒绝;它在我们的局域网内)。在尝试HttpClient连接之前测试打开的端口
我宁愿不要依靠捕捉异常来处理这种情况,特别是因为这些方法会抛出一个AggregateException,然后我必须对其进行筛选。
有没有更好的方法来检测这种情况,同时还能获得HttpClient类的好处(远程主机是WebApi服务)?我应该使用类似TcpClient的方法来检查端口是否正在侦听?当然,这涉及到呼叫之间的竞争条件。我希望构造函数重载需要一个HttpMessageHandler会有帮助,但没有在WebRequestHandler在我要么跳下......
答
可以使用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连接尝试并将失败捕获到那里,但如果我找不到这种方法,我会接受此答案... – 2013-04-12 16:19:17