C# HttpClient无法访问简单网站

C# HttpClient无法访问简单网站,c#,.net,http,web,dotnet-httpclient,C#,.net,Http,Web,Dotnet Httpclient,这是我的密码 internal static void ValidateUrl(string url) { Uri validUri; if(Uri.TryCreate(url,UriKind.Absolute,out validUri)) { using (HttpClient client = new HttpClient()) { try {

这是我的密码

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).
我所要做的就是让这段代码验证给定的网站是否已启动并正在运行。
有什么想法吗?

这就是
EnsureStatusIsSuccessful()
所做的,如果状态代码(从web服务器返回)不是其中之一,它会引发异常

要简单地检查而不引发异常,您可以使用
issuccesstatuscode
属性。像这样:

HttpResponseMessage response = client.Get(url);
bool isValidAndAccessible = response.IsSuccessStatusCode;
请注意,它只是检查
StatusCode
是否在成功范围内

在您的情况下,状态代码(407)表示您正在通过需要身份验证的代理访问该网站,然后请求失败。您可以执行以下操作:

  • 使用
    WebProxy
    class为代理提供设置(如果默认设置不起作用)
  • 不要下载页面,只需尝试ping web服务器即可。你不知道它是否是一个网页,但你会确保它是可访问的,并且是一个有效的URL。是否适用取决于上下文,但在HTTP请求失败时可能有用
MSDN中使用
WebProxy
WebRequest
(HttpWebRequest的基类)的示例:

var request=WebRequest.Create(“http://www.contoso.com");
request.Proxy=新的WebProxy(“http://proxyserver:80/“,对);
var response=(HttpWebResponse)request.GetResponse();
int statusCode=(int)response.statusCode;

bool isValidAndAccessible=statusCode>=200&&statusCode您正在调用EnsureStatusIsSuccessful(),它理所当然地抱怨请求未成功,因为您和主机之间存在需要身份验证的代理服务器

如果您使用的是Framework4.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;
 }
内部静态异步任务ValidateUrl(字符串url)
{
乌里·瓦利杜里;
if(Uri.TryCreate(url,UriKind.Absolute,out validUri))
{
var client=新的HttpClient();
var response=await client.GetAsync(validUri,HttpCompletionOption.ResponseHeadersRead);
返回response.IsSuccessStatusCode;
}
返回false;
}

这基本上就是它所说的:您试图通过一个未经身份验证的代理访问服务


我猜这意味着您的服务器是通过Web服务访问的,但是不允许它访问它试图访问的URL,因为它试图通过未经身份验证的代理访问它

嗯,我不会调用一个抛出异常的方法来吞并该异常……如果要检查的属性不正确,但我不想与OPs版本有太大的偏离。已更改。所有答案均有效,因为它使用了最新的4.5 async await关键字。我会坚持这个。感谢@OliverThanks的回答@Adriano如果不是关于使用async和Wait,我会采用这种方法。
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;
 }