2011-09-23 84 views
21

我希望我的程序在C#中執行前檢查網站是否在線,如何讓我的程序能ping通網站並檢查C#中的響應?如何檢查一個網站是否在C#中在線?

+5

對[平類]同步和異步的例子(http://msdn.microsoft.com/en- us/library/system.net.networkinformation.ping.aspx)MSDN上的頁面。 – drew010

+0

+1。學到了新東西:D –

+2

您也可以使用WebClient類並請求資源或URL。 Ping不一定意味着網站在線,除非你只是想檢查服務器是否啓動。 – lahsrah

回答

38

您已使用System.Net.NetworkInformation.Ping見下文。

var ping = new System.Net.NetworkInformation.Ping(); 

var result = ping.Send("www.google.com"); 

if (result.Status != System.Net.NetworkInformation.IPStatus.Success) 
    return; 
+6

Ping不會告訴你網站是否在線,只是網絡堆棧是否響應。更重要的是,您將一個HTML網址傳遞給ping,這不合法。 –

+1

這是迄今爲止最好的答案,因爲班級甚至被稱爲「Ping」,所以它也許是最正確的答案。感謝您的幫助。另外,如果有人在將來閱讀此文,請參閱手冊的鏈接:http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx – Alper

+0

至於我不工作 - 它會拋出一個異常(當主機不可用時),而不是簡單地處理它並返回一個相應的IPStatus值 – Laserson

1

我能想到的最簡單的方法是一樣的東西:

WebClient webClient = new WebClient(); 
byte[] result = webClient.DownloadData("http://site.com/x.html"); 

如果網站不在線DownloadData會拋出異常。

可能有類似的方法來ping網站,但除非您每秒檢查多次,否則這種差異不太可能引人注目。

+9

您不應該下載整個頁面來驗證該網站是否已啓動 – BrokenGlass

+0

在運行到錯誤503後,webclient對我更好,而不是httpwebrequest,httpwebrequest在webclient再次運行時繼續拋出503。 – bert

40

Ping只告訴你端口是活動的,它並不告訴你它是否真的是一個Web服務。

我的建議是針對URL

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("your url"); 
request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector 
request.Method = "HEAD"; 
try { 
    response = request.GetResponse(); 
    // do something with response.Headers to find out information about the request 
} catch (WebException wex) 
{ 
    //set flag if there was a timeout or some other issues 
} 

這執行HTTP HEAD請求不會實際獲取的HTML頁面,但它會幫助你找到最低的,你需要知道的。對不起,如果代碼不編譯,這只是我的頭頂。

+7

完美。順便說一句,對於那些關心的人來說,實際上有一個「HEAD」的常量。 System.Net.WebRequestMethods.Http.Head。 –

13

小注記Digicoder的代碼和Ping方法的完整的例子:

private bool Ping(string url) 
{ 
    try 
    { 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
     request.Timeout = 3000; 
     request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector 
     request.Method = "HEAD"; 

     using (var response = request.GetResponse()) 
     { 
      return true; 
     } 
    } 
    catch 
    { 
     return false; 
    } 
} 
+1

如果服務器設置不允許我在特定服務器上發送httprequest,該怎麼辦? – Adrian

+0

如果您正在測試一個不允許HEAD但允許GET或POST的服務器,則會出現誤報。 – Vlad

+0

謝謝你的回答。你幫了我很多:) –

3
if (!NetworkInterface.GetIsNetworkAvailable()) 
{ 
    // Network does not available. 
    return; 
} 

Uri uri = new Uri("http://stackoverflow.com/any-uri"); 

Ping ping = new Ping(); 
PingReply pingReply = ping.Send(uri.Host); 
if (pingReply.Status != IPStatus.Success) 
{ 
    // Website does not available. 
    return; 
} 
+0

對NetworkInterfaceGetIsNetworkAvailable()首先包含簡單檢查的投票 – LucasS

+0

Downvote延續ping響應與網站可用有關的神話。 – spender