2013-04-09 39 views
3

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

我宁愿不要依靠捕捉异常来处理这种情况,特别是因为这些方法会抛出一个AggregateException,然后我必须对其进行筛选。

有没有更好的方法来检测这种情况,同时还能获得HttpClient类的好处(远程主机是WebApi服务)?我应该使用类似TcpClient的方法来检查端口是否正在侦听?当然,这涉及到呼叫之间的竞争条件。我希望构造函数重载需要一个HttpMessageHandler会有帮助,但没有在WebRequestHandler在我要么跳下......

回答

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 
} 
+1

感谢您的回答,不幸的是,这仍然依赖于捕获程序逻辑的异常,并且在我检查打开的端口和尝试连接时仍然存在争用情况。我仍然在寻找一种方法来挂钩实际的HTTP连接尝试并将失败捕获到那里,但如果我找不到这种方法,我会接受此答案... – 2013-04-12 16:19:17

相关问题