2016-09-28 4 views
0

Ich habe einigen Code geschrieben zu überprüfen, ob alle Websites in meiner Datenbank zu sehen, immer noch und online gehostet werden.Einige Websites Httpclient-Anfragen sogar mit Header Ablehnung gesetzt

Das Problem ist, einige dieser Seiten scheinen bietet Schutz zu haben, und wenn ich versuche dann zu verlangen, über Httpclient sie lösen einen Fehler stattdessen die Seite angezeigt werden kann.

Ich habe ähnliche Fragen gesehen, die in Browser-Header hinzufügen vorschlagen, damit ich dies getan haben, aber das hilft nicht. Die gleichen Websites lehnen die HttpClient-Verbindung immer noch ab, sind aber vollkommen in Ordnung, wenn ich sie im Browser anschaue.

Habe ich etwas falsch mit meinem Code getan oder brauche ich einige zusätzliche Schritte?

Hier ist mein Code:

public static async Task CheckSite(string url, int id) 
{ 
    try 
    { 
     using(var db = new PlaceDBContext()) 
     using (HttpClient client = new HttpClient(new HttpClientHandler() 
     { 
      AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip 
     })) 
     using (HttpResponseMessage response = await client.GetAsync(url)) 
     using (HttpContent content = response.Content) 
     { 
      client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); 
      client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); 
      client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
      client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); 

      var rd = db.RootDomains.Find(id); 
      string result = await content.ReadAsStringAsync(); 


      if (result != null && result.Length >= 50) 
      { 
       Console.WriteLine("fine"); 
       rd.LastCheckOnline = true; 
      } 
      else 
      { 
       Console.WriteLine("There was empty or short result"); 
       rd.LastCheckOnline = false; 
      } 
      db.SaveChanges(); 
      semaphore.Release(); 
     } 
    } 
    catch(Exception ex) 
    { 

     Console.WriteLine(ex.Message); 
     using(var db = new PlaceDBContext()) 
     { 
      var rd = db.RootDomains.Find(id); 
      rd.LastCheckOnline = false; 
      db.SaveChanges(); 
      semaphore.Release(); 
     } 
    } 

} 
+1

Sie setzen Ihre Kopfzeilen, nachdem Sie Ihre Anfrage gesendet haben. Sie müssen Ihre 'client.DefaultRequestHeaders.TryAddWithoutValidation' verschieben, um sie vor' client.GetAsync() 'auszuführen. – Howwie

+0

Setzen Sie die Header, bevor Sie die Anfrage senden. Sie tun es, nachdem Sie bereits eine Antwort erhalten haben – Nkosi

Antwort

0

die Header ein, bevor Sie die Anfrage senden. Sie tun dies, nachdem Sie bereits eine Antwort erhalten haben.

public static async Task CheckSite(string url, int id) { 
    try { 
     using (var db = new PlaceDBContext()) 
     using (var client = new HttpClient(new HttpClientHandler() { 
      AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip 
     })) { 
      client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); 
      client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
      client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); 

      using (var response = await client.GetAsync(url)) 
      using (var content = response.Content) { 
       client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); 

       var rd = db.RootDomains.Find(id); 
       string result = await content.ReadAsStringAsync(); 


       if (result != null && result.Length >= 50) { 
        Console.WriteLine("fine"); 
        rd.LastCheckOnline = true; 
       } else { 
        Console.WriteLine("There was empty or short result"); 
        rd.LastCheckOnline = false; 
       } 
       db.SaveChanges(); 
       semaphore.Release(); 
      } 
     } 
    } catch (Exception ex) { 

     Console.WriteLine(ex.Message); 
     using (var db = new PlaceDBContext()) { 
      var rd = db.RootDomains.Find(id); 
      rd.LastCheckOnline = false; 
      db.SaveChanges(); 
      semaphore.Release(); 
     } 
    } 

} 
+0

Danke, es funktioniert jetzt – Guerrilla

Verwandte Themen