C# HttpClient.SendAsync jeter “Une erreur s'est produite lors de l'envoi de la demande” d'exception lors de l'essai de certaines Url
Je développe une application console C# pour tester si une URL est valide ou de travaux. Il fonctionne bien pour la plupart des Url et peut obtenir de réponse avec le Code d'État HTTP de site web cible. Mais lors de l'essai de quelques autres Url, l'application de jeter un "Une erreur s'est produite lors de l'envoi de la demande" d'exception lors de l'exécution de HttpClient.SendAsync méthode. Donc je ne peux pas obtenir aucune réponse, ni de Code d'État HTTP, même cette URL fonctionne réellement dans le navigateur. Je suis désespérée de trouver comment gérer ce cas. Si l'URL ne fonctionne pas, ou que le serveur de rejeter ma demande, il devrait au moins me donner correspondant code d'État HTTP.
Voici le code simplifié de mon test de l'application:
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)
{
}
}
}
}
}
OriginalL'auteur codigube | 2015-10-04
Vous devez vous connecter pour publier un commentaire.
Si vous regardez la
InnerException
vous verrez que:Cette URL ne fonctionne pas sur mon navigateur.
Afin d'obtenir une réponse HTTP, vous devez le client pour être en mesure de communiquer avec le serveur (même afin d'obtenir erreur 404) et dans votre cas, l'erreur s'est produite au niveau DNS.
Certains navigateurs avoir l'auto-complétion pour ce genre de cas où si une URL spécifique n'est pas trouvé, le navigateur essaie à nouveau avec un autre suffixe/préfixe, par exemple:
Mais notez que vous pouvez modifier votre code à partir de:
:
Et vous serez en mesure de voir quelles sont les causes de votre erreur.
Aussi, vous ne devriez jamais Vous voulez prendre le générique
Exception
à moins que le lanceur a lancé le génériqueException
, et même que, jamais attraper et de ne rien faire, à l'exception, au moins du journal.Avis que depuis que vous attendez seulement pour que l'une des tâches que vous pouvez utiliser:
Au lieu de:
Task.WhenAll
crée un nouveauTask
quand laTask
s sont terminés. dans votre cas, vous avez besoinTask.WaitAll
ouTask.WhenAll(...).Wait()
.Task.WhenAll
sera de retour une awaitable qui doit être attendu. Si il veut le blocage de la version,Task.WaitAll
est ce qu'il doit utiliser.Vous avez écrit ceci juste au moment où j'ai terminé le montage 🙂
Merci @TamirVered et Yuval Itzchakov m'aider à trouver les détails d'exception et d'améliorer mon code. Maintenant, la question devient comment puis-je savoir si cette URL fonctionne ou pas quand ce DNS problème de niveau qui se passe. Parce que dans de nombreux cas, l'URL fonctionne réellement. Découvrez l'essai de l'URL de la partie, j'ai juste ajouté ce cas.
Vous pouvez lire les
InnerException
de nouveau pour voir la raison de l'erreur et de laInternalStatus
pour voir l'état de votre connexion après."Cette URL ne fonctionne pas sur mon navigateur." - Cela m'a aidé, j'avais mis le DNS interne de l'op à tort 😉
OriginalL'auteur Tamir Vered