C# HttpClient.SendAsync 在测试某些 URL 时抛出 "An error occurred while sending the request" 异常
C# HttpClient.SendAsync throw "An error occurred while sending the request" exception when testing some URLs
我正在开发一个 C# 控制台应用程序来测试 URL 是否有效或有效。它适用于大多数 URLs,并且可以从目标网站获得带有 HTTP 状态代码的响应。但是在测试其他一些 URL 时,应用程序在 运行 HttpClient.SendAsync 方法时抛出 "An error occurred while sending the request" 异常。所以我无法得到任何响应或 HTTP 状态代码,即使这个 URL 实际上在浏览器中工作。我很想知道如何处理这个案子。如果 URL 不起作用或服务器拒绝我的请求,它至少应该给我相应的 HTTP 状态代码。
以下是我的测试应用程序的简化代码:
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace TestUrl
{
class Program
{
static void Main(string[] args)
{
// var urlTester = new UrlTester("http://www.sitename.com/wordpress"); // works well and get 404
// var urlTester = new UrlTester("http://www.fc.edu/"); // Throw exception and the URL doesn't work
var urlTester = new UrlTester("http://www.ntu.edu.tw/english/"); // Throw exception and the URL works actually
Console.WriteLine("Test is started");
Task.WhenAll(urlTester.RunTestAsync());
Console.WriteLine("Test is stoped");
Console.ReadKey();
}
public class UrlTester
{
private HttpClient _httpClient;
private string _url;
public UrlTester(string url)
{
_httpClient = new HttpClient();
_url = url;
}
public async Task RunTestAsync()
{
var httpRequestMsg = new HttpRequestMessage(HttpMethod.Head, _url);
try
{
using (var response = await _httpClient.SendAsync(httpRequestMsg, HttpCompletionOption.ResponseHeadersRead))
{
Console.WriteLine("Response: {0}", response.StatusCode);
}
}
catch (Exception e)
{
}
}
}
}
}
如果您查看 InnerException
,您会看到:
"The remote name could not be resolved: 'www.fc.edu'"
这个 URL 在我的浏览器上也不起作用。
为了获得 HTTP 响应,您需要客户端能够与服务器通信(即使是为了获得 error 404) and in your case the error occurred at the DNS level.
某些浏览器针对这种情况具有自动完成功能,如果未找到特定 URL,浏览器将使用不同的 suffix/prefix 重试,例如:
try "x"
if didn't work, try "www." + x
if this didn't work try "www." + x + ".com"
if this didn't work try "www." + x + ".net"
if this didn't work try "www." + x + "." + currentRegionSuffix.
但请注意,您可以更改代码:
catch (Exception e)
{
}
收件人:
catch (HttpRequestException e)
{
Console.WriteLine(e.InnerException.Message);
}
您将能够看到导致错误的原因。
另外,你不应该想要抓住通用的 Exception
除非投掷者已经抛出通用的 Exception
,甚至比,永远不要捕获异常并且不做任何事情,至少记录它。
请注意,由于您只等待一项任务,因此您可以使用:
urlTester.RunTestAsync().Wait();
而不是:
Task.WhenAll(urlTester.RunTestAsync());
Task.WhenAll
在给定的 Task
完成后创建一个新的 Task
。在您的情况下,您需要 Task.WaitAll
或 Task.WhenAll(...).Wait()
.
我解决了这个问题:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls;
我正在开发一个 C# 控制台应用程序来测试 URL 是否有效或有效。它适用于大多数 URLs,并且可以从目标网站获得带有 HTTP 状态代码的响应。但是在测试其他一些 URL 时,应用程序在 运行 HttpClient.SendAsync 方法时抛出 "An error occurred while sending the request" 异常。所以我无法得到任何响应或 HTTP 状态代码,即使这个 URL 实际上在浏览器中工作。我很想知道如何处理这个案子。如果 URL 不起作用或服务器拒绝我的请求,它至少应该给我相应的 HTTP 状态代码。
以下是我的测试应用程序的简化代码:
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace TestUrl
{
class Program
{
static void Main(string[] args)
{
// var urlTester = new UrlTester("http://www.sitename.com/wordpress"); // works well and get 404
// var urlTester = new UrlTester("http://www.fc.edu/"); // Throw exception and the URL doesn't work
var urlTester = new UrlTester("http://www.ntu.edu.tw/english/"); // Throw exception and the URL works actually
Console.WriteLine("Test is started");
Task.WhenAll(urlTester.RunTestAsync());
Console.WriteLine("Test is stoped");
Console.ReadKey();
}
public class UrlTester
{
private HttpClient _httpClient;
private string _url;
public UrlTester(string url)
{
_httpClient = new HttpClient();
_url = url;
}
public async Task RunTestAsync()
{
var httpRequestMsg = new HttpRequestMessage(HttpMethod.Head, _url);
try
{
using (var response = await _httpClient.SendAsync(httpRequestMsg, HttpCompletionOption.ResponseHeadersRead))
{
Console.WriteLine("Response: {0}", response.StatusCode);
}
}
catch (Exception e)
{
}
}
}
}
}
如果您查看 InnerException
,您会看到:
"The remote name could not be resolved: 'www.fc.edu'"
这个 URL 在我的浏览器上也不起作用。
为了获得 HTTP 响应,您需要客户端能够与服务器通信(即使是为了获得 error 404) and in your case the error occurred at the DNS level.
某些浏览器针对这种情况具有自动完成功能,如果未找到特定 URL,浏览器将使用不同的 suffix/prefix 重试,例如:
try "x"
if didn't work, try "www." + x
if this didn't work try "www." + x + ".com"
if this didn't work try "www." + x + ".net"
if this didn't work try "www." + x + "." + currentRegionSuffix.
但请注意,您可以更改代码:
catch (Exception e)
{
}
收件人:
catch (HttpRequestException e)
{
Console.WriteLine(e.InnerException.Message);
}
您将能够看到导致错误的原因。
另外,你不应该想要抓住通用的 Exception
除非投掷者已经抛出通用的 Exception
,甚至比,永远不要捕获异常并且不做任何事情,至少记录它。
请注意,由于您只等待一项任务,因此您可以使用:
urlTester.RunTestAsync().Wait();
而不是:
Task.WhenAll(urlTester.RunTestAsync());
Task.WhenAll
在给定的 Task
完成后创建一个新的 Task
。在您的情况下,您需要 Task.WaitAll
或 Task.WhenAll(...).Wait()
.
我解决了这个问题:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls;