2013-04-09 100 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

相關問題