2016-09-28 7 views
0

Я написал код для проверки того, все ли сайты в моей базе данных все еще размещены и онлайн.Некоторые веб-сайты, отклоняющие запросы HttpClient, даже с набором заголовков

Проблема заключается в том, что некоторые из этих сайтов имеют ботовую защиту, и всякий раз, когда я пытаюсь запросить, через HttpClient они вызывают ошибку вместо отображения страницы.

Я видел другие подобные вопросы, которые предлагают добавить в заголовки браузера, чтобы я сделал это, но это не поможет. Те же сайты по-прежнему отклоняют соединение HttpClient, но отлично смотрятся, когда я просматриваю их в браузере.

Я сделал что-то не так с моим кодом или мне нужны дополнительные шаги?

Вот мой код:

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

Вы настраиваете свои заголовки после того, как вы отправили запрос. Вам нужно переместить свой 'client.DefaultRequestHeaders.TryAddWithoutValidation' для выполнения перед' client.GetAsync() ' – Howwie

+0

. Установите заголовки перед отправкой запроса. Вы делаете их после получения ответа – Nkosi

ответ

0

Установите заголовки перед отправкой запроса. Вы делаете это после получения ответа

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

Спасибо, сейчас он работает – Guerrilla

 Смежные вопросы

  • Нет связанных вопросов^_^