postasync example ejemplos ejemplo dotnet c# .net http dotnet-httpclient

example - httpwebrequest c#



C#HttpClient.SendAsync lanza la excepción "Se produjo un error al enviar la solicitud" al probar algunas URL (1)

Estoy desarrollando una aplicación de consola de C # para probar si una URL es válida o funciona. Funciona bien para la mayoría de las URL y puede obtener respuesta con el Código de estado HTTP del sitio web de destino. Pero al probar otras URL, la aplicación lanza una excepción "Se produjo un error al enviar la solicitud" al ejecutar el método HttpClient.SendAsync. Así que no puedo obtener ninguna respuesta o código de estado HTTP, incluso esta URL realmente funciona en el navegador. Estoy desesperado por saber cómo manejar este caso. Si la URL no funciona o el servidor rechaza mi solicitud, al menos debería darme el código de estado HTTP correspondiente.

Aquí está el código simplificado de mi aplicación de prueba:

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) { } } } } }


Si miras la InnerException verás que:

"El nombre remoto no se pudo resolver: ''www.fc.edu''"

Esta URL tampoco funciona en mi navegador.

Para obtener una respuesta HTTP, necesita que el cliente pueda comunicarse con el servidor (incluso para obtener el error 404 ) y, en su caso, el error ocurrió en el nivel de DNS .

Algunos navegadores tienen finalización automática para este tipo de casos donde, si no se encuentra una URL específica, el navegador vuelve a intentar con un sufijo / prefijo diferente, por ejemplo:

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.

Pero tenga en cuenta que puede cambiar su código de:

catch (Exception e) { }

A:

catch (HttpRequestException e) { Console.WriteLine(e.InnerException.Message); }

Y podrás ver qué causa tu error.

Además, nunca debería querer capturar la Exception genérica a menos que el lanzador haya lanzado la Exception genérica , e incluso que, nunca atrape y no haga nada con la excepción, al menos inicie sesión.

Tenga en cuenta que ya que solo espera esa tarea puede utilizar:

urlTester.RunTestAsync().Wait();

En lugar de:

Task.WhenAll(urlTester.RunTestAsync());

Task.WhenAll crea una nueva Task cuando se completan las Task dadas. en su caso necesita Task.WaitAll o Task.WhenAll(...).Wait() .