C# - ошибка 500 при запросе к сайту

Пытаюсь сделать запрос к сайту https://1clancer.ru через C#.

Библиотека HtmlAgilityPack:

var htmlWeb = new HtmlWeb();
var doc = htmlWeb.Load("https://1clancer.ru");

Console.WriteLine(doc.DocumentNode.InnerHtml);

Стандартная библиотека HttpClient:

var client = new HttpClient();
var html = client.GetAsync("https://1clancer.ru");

Console.WriteLine(html.Result);

Оба варианта приводят к ответу 500 от сервера. введите сюда описание изображения

При этом, при запросе через код на Питоне всё работает.

import requests

response = requests.get('https://1clancer.ru')
print(response.text)

Ответы (1 шт):

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

Серверу просто нужен HTTP заголовок Accept, просто скопировал его из логов Firefox. User-Agent необязателен здесь, но пусть будет. Это особенность конкретного текущего сервера, и решение не относится ко всем сайтам интернета в целом.

Еще сервер возвращает ответ в древней кодировке Content-Type: text/html; charset=windows-1251, поэтому я подключил кодировки Windows через RegisterProvider. Это нужно сделать 1 раз при запуске приложения до начала всех запросов на сервер. (Если вы используйете древний Framework 4.x, то кодировка 1251 там подключена по умолчанию, ничего дополнительно подключать не требуется).

private static readonly HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All });

static async Task Main(string[] args)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0");
    client.DefaultRequestHeaders.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8");

    string html = await client.GetStringAsync("https://1clancer.ru");

    HtmlDocument doc = new HtmlDocument(); // HtmlAgilityPack
    doc.LoadHtml(html);
    string title = doc.DocumentNode.SelectSingleNode("//title").InnerText;
    Console.WriteLine(title);
}

HttpClient и DefaultRequestHeaders к нему тоже достаточно создать один раз на все время работы приложения. Далее пользоваться одним и тем же клиентом в разных запросах.

Ответ от сервера 200 OK, вывод в консоль

Сервис удаленной работы для 1С программистов (1С фриланс, 1C freelance). обслуживание 1С, 1С настройка, программирование 1С :: 1Clancer.ru
→ Ссылка