2016-09-28 22 views
0

データベースのすべてのWebサイトが引き続きホストされオンラインであるかどうかを確認するためのコードを記述しました。ヘッダーが設定されていてもHttpClient要求を拒否するWebサイト

これらのサイトの中にはボットプロテクションがあるものがあり、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

関連する問題