2013-10-15 24 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