C# HttpWebRequest и UserAgent
Использую следующий код для получения ответа от сервера при помощи HttpWebRequest (код сокращён до минимума, захардкоден и используется только в качестве примера):
var request = (HttpWebRequest)HttpWebRequest.Create("https://www.digikey.com/en/products/detail/vector-electronics/VME64E02P01/6819140");
request.Headers.Add(HttpRequestHeader.AcceptEncoding, @"gzip, deflate, br");
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.9");
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
request.AutomaticDecompression = DecompressionMethods.GZip;
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36";
var response = (HttpWebResponse)request.GetResponse();
Проблема заключается в следующем: если я использую User-Agent, то от сайта возвращается ошибка "Удаленный сервер возвратил ошибку: (403) Запрещено". При этом, если закомментировать строку, где происходит присвоение User-Agent, то сайт успешно возвращает ответ. User-Agent используется из последней версии хрома. Также я провёл тест в Zennoposter, который отправляет GET-запрос с User-Agent в заголовках и подобных проблем не наблюдается. Это какой-то баг .NET или я что-то упускаю?
Ответы (1 шт):
HttpWebRequest устарел, используйте HttpClient.
У меня работает без ошибок
class Program
{
static readonly HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All });
static async Task Main(string[] args)
{
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36");
client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br");
client.DefaultRequestHeaders.AcceptLanguage.ParseAdd("en-US,en;q=0.9");
client.DefaultRequestHeaders.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
try
{
string response = await client.GetStringAsync("https://www.digikey.com/en/products/detail/vector-electronics/VME64E02P01/6819140");
Console.WriteLine(response);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
В консоль выводится очень большой HTML документ.
Методом проб и ошибок выяснили, что на .NET Framework 4.7.2 проблема есть, а на .NET 5 - нет. Видимо все-таки в HttpRequestHandler есть баги (или какие-то причуды сервера) и SocketsHttpHandler работает лучше.
Еще выяснили, что для фреймворка помогло client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");