Я написал код для проверки того, все ли сайты в моей базе данных все еще размещены и онлайн.Некоторые веб-сайты, отклоняющие запросы 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();
}
}
}
Вы настраиваете свои заголовки после того, как вы отправили запрос. Вам нужно переместить свой 'client.DefaultRequestHeaders.TryAddWithoutValidation' для выполнения перед' client.GetAsync() ' – Howwie
. Установите заголовки перед отправкой запроса. Вы делаете их после получения ответа – Nkosi