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