1

Пытаюсь получить HTML страницы: https://minsk.btrans.by/avtobus/1%d1%82 или же https://minsk.btrans.by/avtobus/1т через HttpClient.GetAsync, но в ресультате пустая строка, хотя при попытке получить HTML с данной страницы:https://minsk.btrans.by/avtobus/1 все удается

HTMLAgilityPack пробовал, но результат тот: не парсит контретно с этой страницы

Код:

using System;
using System.Net;
using System.Net.Http;
using System.Text;
namespace TestProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "https://minsk.btrans.by/avtobus/1%d1%82";
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = client.GetAsync(url).Result)
                {
                    using (HttpContent content = response.Content)
                    {
                        string result = content.ReadAsStringAsync().Result;
                        Console.WriteLine(result);
                    }
                }
            }
        }
    }
}
  • 1
    client.GetAsync(url).Result - серьезно? Забудьте про написание сразу запроса кодом! Займитесь анализом сайта, поймите как он устроен, как у него появляются данные, от куда он их берет, попробуйте составить запрос в любом конструкторе (Postman например), а вот когда получите в конструкторе готовый, рабочий запрос, без кучи лишнего, тогда уже и думайте про написание C# кода. Почитайте это... – EvgeniyZ Jun 15 '21 at 19:21
  • Console.WriteLine(response); поможет узнать, что ответил сервер – aepot Jun 15 '21 at 19:53
  • Я как бы нашел проблему, HttpClient оправляет запрос /avtobus/1%D1%82, и получает 302 редирект на /avtobus/1%d1%82, но не следует ему. Проблема кроется внутри класса Uri, но я не могу понять, как ее побороть. @EvgeniyZ задача интересная, есть идеи? Как бы я не пытался подсунуть разные данные даже через рефлексию в инстанс Uri, у меня ничего не вышло (замена поля _string портит Uri). Если кратко, Uri парсит 1%d1%82 как при создании инстанса, а в запрос отдает /avtobus/1%D1%82. Какая-то фишка дотнета, побороть которую мне не удалось. – aepot Jun 15 '21 at 21:01
  • @aepot Бился с этим 2+ часа, решение тоже не нашел. Тут проблема больше в сайте, чем в фреймворке. Сайт требует именно нижний регистр, иначе, редирект. C# следует всем правилам и конвертирует текст так, как положено, но увы... В итоге там цикличный редирект идет. Интересный факт, если написать HttpUtility.UrlPathEncode("https://minsk.btrans.by/avtobus/15д");, выдаст строку в нижнем регистре, но Uri поправит. Попробовал new Uri(address, true) (хоть он устарел, но всеж), передал ему результат UrlPathEncode, но Uri не все поля заполнил. Пробовал через билдер, не дало результат. – EvgeniyZ Jun 16 '21 at 00:05
  • @EvgeniyZ понял, попробую сегодня еще поковырять. То что сайт странно себя ведет - факт. Но в браузерах же работает, а это значит что дотнет надо фиксить. – aepot Jun 16 '21 at 05:44
  • @aepot буду признателен если найдете способ как это починить или обойти. Попробовал отправить запрос с помощью Fiddler и все работает, так что это скорее всего бага дотнета – Fat Alien Jun 16 '21 at 05:57
  • Это скорее баг сервера, а не дотнета. То что дотнет обладает меньшей толерантностью к такого рода косякам - это не баг дотнета. Но дотнет можно пофиксить до уровня браузера. Выставление багов в dotent/runtime - штука не простая, фикс тоже может ехать очень долго, то есть в .NET 7 например только успеет. Поэтому самое простое решение - это таки найти лазейку, вплоть до низкоуровневой отправки запросов через сокеты. Я еще поковыряю этот вопрос, но позднее. – aepot Jun 16 '21 at 10:50

0 Answers0