Потеря кодировки сайта через WebClient

Делаю запрос на серверы гугл и получаю вместо русского языка крокозябру, менял кодировки не помогло, может у гугла на поисковик какая нибудь хитрая кодировка стоит. Класс для отправки запроса:

public static class MyWebRequest
{
    public static string Get(string url, Dictionary<string, string> QueryParameters = null, Encoding encoding = null)
    {
        using var webClient = new WebClient();
        if (encoding != null)
        {
            webClient.Encoding = encoding;
        }
        if (QueryParameters != null && QueryParameters.Count != 0)
        {
            foreach (var queryParameter in QueryParameters)
            {
                webClient.QueryString.Add(queryParameter.Key, queryParameter.Value);
            }
        }
        return webClient.DownloadString(url);
    }
}

Сам запрос:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var result = MyWebRequest.Get("https://www.google.com/search",
                new Dictionary<string, string>() { ["q"] = textBoxSearch.Text.Replace(' ', '+')}, Encoding.GetEncoding("UTF-8"));

Сам сайт гугла говорит что у него в UTF-8 мол поисковая страница стоит. В чем может быть проблема? П.С. переписал запрос на HttpClient но крокозябры остались

public static string Get(string url, Dictionary<string, string> QueryParameters = null)
{
    Task<HttpResponseMessage> response;
    if (QueryParameters != null && QueryParameters.Count != 0)
    {
        response = client.GetAsync($"{url}?{QueryParameters.Select(s => $"{s.Key}={s.Value}").Aggregate((a, b) => $"{a}&{b}")}");
    }
    else
    {
        response = client.GetAsync(url);
    }
    return response.Result.Content.ReadAsStringAsync().Result;
}

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

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

Делаете много лишних телодвижений.

public static class MyWebRequest
{
    private static readonly HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All })
    { 
        DefaultRequestVersion = HttpVersion.Version20
    };

    public static async Task<string> GetAsync(string url, Dictionary<string, string> queryParameters = null)
    {
        UriBuilder builder = new UriBuilder(url);
        if (queryParameters?.Count > 0)
        {
            builder.Query = await new FormUrlEncodedContent(queryParameters).ReadAsStringAsync();
        }

        return await client.GetStringAsync(builder.Uri);
    }
}

Проверяю, использую NuGet пакет HtmlAgilityPack.

static async Task Main(string[] args)
{
    var html = await MyWebRequest.GetAsync("https://www.google.com/search", new Dictionary<string, string>() { ["q"] = "get запрос C#" });
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    var title = HtmlEntity.DeEntitize(doc.DocumentNode.SelectSingleNode("//title").InnerText);
    Console.WriteLine(title);
}

Вывод в консоль

get запрос C# - Поиск в Google

Кодировки типа ANSI и UTF-8 определяются автоматически. А если зарегать провайдер Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); то и Win1251 скушает само.


Асинхронный обработчик кнопки в WPF выглядел бы так.

private async void Button1_Click(object sender, RoutedEventArgs e)
{
    Button btn = (Button)sender;
    btn.IsEnabled = false; // защита от повторного нажатия, так как
                           // если не морозить UI, теперь он работает во время выполнения кода.
                           // в этом и есть смысл асинхронности здесь

    var html = await MyWebRequest.GetAsync("https://www.google.com/search", new Dictionary<string, string>() { ["q"] = "get запрос C#" });
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    var title = HtmlEntity.DeEntitize(doc.DocumentNode.SelectSingleNode("//title").InnerText);
    Debug.WriteLine(title);

    btn.IsEnabled = true;
}
→ Ссылка