データベースのすべての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();
}
}
}
あなたのリクエストを送った後、あなたのヘッダーを設定しています。 'client.DefaultRequestHeaders.TryAddWithoutValidation'を' client.GetAsync() 'の前に実行する必要があります。 – Howwie
リクエストを送信する前にヘッダを設定してください。あなたはすでに応答を得た後にそれらをやっています – Nkosi