2009-06-25 216 views
16

任何人都可以建議如果遠程服務器可用,檢查(使用.NET 3.5)的最佳方法是什麼?C#檢查遠程服務器

我想用下面的代碼,但想知道,如果社會上有另一種選擇存在更好的方法。

TcpClient client = new TcpClient("MyServer", 80); 
if (!client.Connected) 
{ 
    throw new Exception("Unable to connect to MyServer on Port 80"); 
} 
client.Close(); 

回答

25

你可以ping

你可以download the default page從中

你可以做一個HEAD要求

如果這是你網絡上的本地IIS6服務器,和你有一些管理細節,你可以connect to IIS使用一些DirectoryEntry代碼

136615上的一些答案也可能有所幫助,特別是接受的ans更多關於sockets

對於打印服務器(或者特別是打印機),K Scott here的代碼可能會有所幫助。這很有趣的代碼反正玩:-)該代碼提到dns.resolve,這是過時和Dns.GetHostEntry

我黔驢技窮了:-)

8

如果你只是想看到一個給定服務器是否在線,然後簡單的ping應該做在大多數情況下工作。

PingReply pingReply; 
using (var ping = new Ping()) 
    pingReply = ping.Send("http://www.stackoverflow.com/"); 
var available = pingReply.Status == IPStatus.Success; 

使用此方法,您也不會以任何方式濫用HTTP服務器。

否則(如果你想檢查是否可以連接特定端口上),基本上看起來不錯。

+0

我的印象是,使用Ping對象在企業內聯網或有防火牆的網絡中是不可取的?我可能應該說我想檢查公司網絡上的可用性。任何人都能評論? – Kane 2009-06-25 11:21:45

+0

@Kane:爲什麼不可取? ping是檢查主機可用性的標準,經過嘗試和測試的方式。打開大量的HTTP連接並且無所事事更可能相當於濫用/惡意。如果ping端口是關閉的,那麼這是一個不同的問題 - 但是,它應該被打開。 – Noldorin 2009-06-25 11:25:09

+0

我認爲如果防火牆阻止Ping(ICMP Echo)數據包,Ping可能無法工作?難道這是真的,因爲我真的不知道? – Kane 2009-06-25 11:29:08

1

我猜你想檢查網站是否可用。您可以使用System.Net.WebRequest並檢查結果。

更新:基於您的評論 ,如果你有幾臺服務器(和服務)進行監控,那麼也許它會是一個更好的主意,用一個包,如NagiosHostMonitorIPSentry代替滾動你自己的。

3

只是添加到丹的回答取代.. 我只需要實現這一點,這裏有一個很好的小代碼片斷,它應該可以幫助那些從Google獲得的代碼片段。

Imports System.Net 
Private Function URLExists(pURL As String) As Boolean 

    Try 
     'Creating the HttpWebRequest 
     Dim request As HttpWebRequest = TryCast(WebRequest.Create(pURL), HttpWebRequest) 
     'Setting the Request method HEAD, you can also use GET too. 
     request.Method = "HEAD" 
     'Getting the Web Response. 
     Dim response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse) 
     'Returns TURE if the Status code == 200 
     Return (response.StatusCode = HttpStatusCode.OK) 
    Catch 
     'Any exception will returns false. 
     Return False 
    End Try 
End Function 

對不起,這是VB,但這是我在我面前。我將把它作爲練習讓讀者根據需要將其轉換爲C#。

2

如果您是使用.NET Framework的早期版本,像我一樣,第2版,你就沒有平安,沒有System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()。然後,你可以使用HttpWebRequest檢查主機disponibility:

public static bool AccessToWebService() 
    { 
     string host = "http://192.168.99.41"; 
     try 
     { 
      HttpWebRequest request = (HttpWebRequest) WebRequest.Create(host); 
      request.Method = "HEAD"; 
      HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 
      return response.StatusCode == HttpStatusCode.OK; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    }