2015-10-04 7 views
13

Ich entwickle eine C# -Konsolenanwendung, um zu testen, ob eine URL gültig ist oder funktioniert. Es funktioniert gut für die meisten URLs und kann mit HTTP-Statuscode von der Zielwebsite beantwortet werden. Wenn Sie jedoch einige andere URLs testen, löst die Anwendung beim Ausführen der HttpClient.SendAsync-Methode die Fehlermeldung "Beim Senden der Anforderung ist ein Fehler aufgetreten" aus. Daher kann ich keine Antwort oder HTTP-Statuscode erhalten, auch wenn diese URL tatsächlich im Browser funktioniert. Ich bin verzweifelt, um herauszufinden, wie ich mit diesem Fall umgehen soll. Wenn die URL nicht funktioniert oder der Server meine Anfrage ablehnt, sollte sie mir zumindest den entsprechenden HTTP-Statuscode geben.C# HttpClient.SendAsync throw Beim Ausprobieren einiger URLs ist ein Fehler beim Senden der Anfrage aufgetreten.

Hier sind die vereinfachte Code meiner Testanwendung:

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

    } 
} 

Antwort

8

Wenn Sie die InnerException sehen sehen Sie, dass:

„Der Remote-Name nicht aufgelöst werden konnte:‚www. fc.edu '"

Diese URL funktioniert auch nicht in meinem Browser.

Um eine HTTP-Antwort zu erhalten, muss der Client mit dem Server kommunizieren können (auch um error 404 zu bekommen) und in Ihrem Fall trat der Fehler at the DNS level auf.

Einige Browser haben Auto-Vervollständigung für diese Art von Fällen, in denen, wenn eine bestimmte URL nicht gefunden wird, der Browser mit einem anderen Suffix/Präfix wiederholt, zum Beispiel:

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. 

Aber beachten Sie, dass Sie ändern können Ihr Code aus:

catch (Exception e) 
{ 

} 

An:

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

Und werden Sie in der Lage t sein o sehen Sie, was Ihren Fehler verursacht.

Auch Sie sollten nie die allgemeine Exception fangen wollen, es sei denn der Werfer die generische Exception geworfen hat, und sogar als, nie zu fangen und nichts mit Ausnahme zu tun, zumindest es loggt sein.

Hinweis als da Sie warten nur für diese eine Aufgabe können Sie:

urlTester.RunTestAsync().Wait(); 

Statt:

Task.WhenAll(urlTester.RunTestAsync()); 

Task.WhenAll schafft ein neues Task, wenn die gegebenen Task s abgeschlossen sind. in Ihrem Fall müssen Sie Task.WaitAll oder Task.WhenAll(...).Wait().

+0

Im Allgemeinen gibt 'Task.WhenAll' ein erwartetes zurück, auf das gewartet werden muss. Wenn er die blockierende Version haben möchte, sollte er 'Task.WaitAll' verwenden. –

+1

Sie schrieb dies nur, wenn ich mit der Bearbeitung fertig bin :) –

+0

Dank @TamirVered und Yuval Itzchakov helfen Sie mir, die Details der Ausnahme herauszufinden und meinen Code zu verbessern. Jetzt stellt sich die Frage, wie kann ich wissen, ob diese URL funktioniert oder nicht, wenn dieses DNS-Level-Problem auftritt. Weil in vielen Fällen die URL tatsächlich funktioniert. Überprüfen Sie den getesteten URL-Teil, ich habe diesen Fall gerade hinzugefügt. – raycode