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)表示您正在通过需要身份验证的代理访问该网站,然后请求失败。您可以执行以下操作:
- 使用
class为代理提供设置(如果默认设置不起作用)WebProxy
- 不要下载页面,只需尝试ping web服务器即可。你不知道它是否是一个网页,但你会确保它是可访问的,并且是一个有效的URL。是否适用取决于上下文,但在HTTP请求失败时可能有用
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;
}