2013-10-15 25 views
0

失敗這裏是我的代碼的HttpClient在訪問簡單的網站

internal static void ValidateUrl(string url) 
{ 
    Uri validUri; 
    if(Uri.TryCreate(url,UriKind.Absolute,out validUri)) 
    { 
     using (HttpClient client = new HttpClient()) 
     { 
      try 
      {      
       HttpResponseMessage response = client.Get(url); 
       response.EnsureStatusIsSuccessful(); 
      } 
      catch (Exception ex) 
      { 
        //exception handler goes here 
      } 
     } 
    } 
} 

該代碼當我運行它會產生這樣的結果。

ProxyAuthenticationRequired (407) is not one of the following: 
OK (200), Created (201), Accepted (202), NonAuthoritativeInformation 
(203), NoContent (204), ResetContent (205), PartialContent (206). 

我想要做的就是讓這段代碼驗證給定的網站是否正常運行。 任何想法?

回答

0

要調用EnsureStatusIsSuccessful(),它理所當然地抱怨說,要求沒有成功,因爲有你們之間的代理服務器需要認證的主機。

如果你在框架4.5上,我已經在下面包含一個稍微增強的版本。

internal static async Task<bool> ValidateUrl(string url) 
{ 
    Uri validUri; 
    if(Uri.TryCreate(url,UriKind.Absolute,out validUri)) 
    { 
    var client = new HttpClient(); 

    var response = await client.GetAsync(validUri, HttpCompletionOption.ResponseHeadersRead); 
    return response.IsSuccessStatusCode; 
    } 

    return false; 
} 
+1

嗯,我不會調用一個方法拋出一個異常只是爲了吞下該異常...如果有屬性來檢查不會拋出 –

+0

是真的,但我並不想偏離太多的OPs版本。無論如何改變。 –

+0

所有答案都是有效的,因爲它使用最新的4.5異步await關鍵字。我會堅持這一個。謝謝@Oliver – Sike12

1

這就是EnsureStatusIsSuccessful()所做的,如果狀態碼(從Web服務器返回)不是其中之一,則會引發異常。

你可以做什麼,簡單地說檢查沒有拋出異常是使用IsSuccessStatusCode屬性。就像這樣:

HttpResponseMessage response = client.Get(url); 
bool isValidAndAccessible = response.IsSuccessStatusCode; 

請注意,它只是檢查是否StatusCode成功範圍內。

在您的情況下,狀態碼(407)意味着您通過需要驗證的代理訪問該網站,然後請求失敗。您可以執行以下操作:

  • WebProxy類提供代理服務器設置(如果默認設置不起作用)。
  • 不要下載頁面,只是嘗試ping網絡服務器。你不會知道它是否是網頁,但你會確定它是可訪問的,並且它是一個有效的URL。如果適用或不適用取決於上下文,但在HTTP請求失敗時可能會有用。使用從MSDN

WebProxyWebRequest(爲HttpWebRequest基類):

var request = WebRequest.Create("http://www.contoso.com"); 
request.Proxy = new WebProxy("http://proxyserver:80/",true); 

var response = (HttpWebResponse)request.GetResponse(); 
int statusCode = (int)response.StatusCode; 
bool isValidAndAccessible = statusCode >= 200 && statusCode <= 299; 
+0

感謝您的答案@Adriano如果不是關於使用異步,並等待我會採取這種方法。 – Sike12

1

這基本上意味着正是它說:那你試圖通過你未認證用戶使用代理訪問服務。

我想這意味着你的服務器是通過Web服務訪問的,但是它不允許訪問它試圖訪問的URL,因爲它試圖通過它沒有通過驗證的代理來訪問它。

+0

指出@kjartan – Sike12