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 шт):

Автор решения: aepot

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");

→ Ссылка