这是我的代码
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 :(得分:1)
这是EnsureStatusIsSuccessful()
的作用,如果状态代码(从Web服务器返回)不是其中之一,它会引发异常。
您可以执行的操作,只需检查而不会抛出异常就是使用IsSuccessStatusCode
属性。像这样:
HttpResponseMessage response = client.Get(url);
bool isValidAndAccessible = response.IsSuccessStatusCode;
请注意,它只会检查StatusCode
是否在成功范围内。
在您的情况下,状态代码(407)表示您通过需要身份验证然后请求失败的代理访问该网站。你可以这样做:
WebProxy
类提供Proxy的设置(如果默认设置不起作用)。 MSDN使用WebProxy
和WebRequest
(HttpWebRequest
的基类)的MSDN示例:
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;
答案 1 :(得分:1)
这基本上意味着它所说的内容:您尝试通过未经过身份验证的代理来访问服务。
我想这意味着您的服务器是从Web服务到达的,但是它不允许访问它尝试访问的URL,因为它试图通过未经过身份验证的代理访问它。
答案 2 :(得分: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;
}