C# HttpClient.Исключение SendAsync throw "произошла ошибка при отправке запроса" при тестировании некоторых URL-адресов
Я разрабатываю консольное приложение C# для тестирования допустимости или работы URL-адреса. Он хорошо работает для большинства URL-адресов и может получить ответ с кодом состояния HTTP с целевого веб-сайта. Но при тестировании некоторых других URL-адресов приложение выдает исключение" ошибка при отправке запроса " при запуске HttpClient.Метод SendAsync. Поэтому я не могу получить ответ или код состояния 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)
{
}
}
}
}
}
1 ответов
если вы посмотрите на InnerException
вы увидите, что:
"удаленное имя не может быть разрешено: 'www.fc.edu'"
этот URL-адрес также не работает в моем браузере.
чтобы получить HTTP-ответ, вам нужно, чтобы клиент мог общаться с сервером (даже для того, чтобы получить ошибка 404) и в вашем случае произошла ошибка на уровне DNS.
некоторые браузеры имеют автозаполнение для такого рода случаев, когда если определенный URL-адрес не найден, браузер повторяет попытку с другим суффиксом / префиксом, например:
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);
}
и вы сможете увидеть то, что вызывает вашу ошибку.
и вы никогда не должны хотеть поймать generic Exception
если метатель не бросил общий Exception
, и даже чем, никогда не ловите и ничего не делайте с исключением, по крайней мере, регистрируйте его.
обратите внимание, чем, так как вы ждете только одной задачи, которую вы можете использовать:
urlTester.RunTestAsync().Wait();
вместо:
Task.WhenAll(urlTester.RunTestAsync());
Task.WhenAll
создает новый Task
, когда данный Task
s завершены. в вашем случае вам нужно Task.WaitAll
или Task.WhenAll(...).Wait()
.