Работа с POST-запросами в C#

Есть сайт, с которого надо спарсить данные. Проблема заключается в том, что я в силу отсутствия опыта не могу правильно это сделать. В дебаггере браузера нашёл, какой примерно POST-запрос надо отправлять:

faculty=0&teacher=&group=%CA%B2-51%EC&sdate=03.02.2020&edate=07.02.2020&n=700

Судя по получаемому ответу, этот запрос принимается и обрабатывается сервером - даты и название группы, отправленные в запросе, подставляются в текстовые поля на получаемой странице(как и при ручном введении этих данных), но вот проблема в следующем - в C# проекте получаемая страница вместо необходимых данных содержит в своём коде сообщение об ошибке, а в Node.JS проекте всё работает как надо. Коды используемых методов:

C#:

public static async Task PostRequestAsync() 
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    WebRequest request = WebRequest.Create("http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi/srequest.cgi");
    request.Method = "POST";
    string data = "n=700&faculty=0&teacher=&group=КІ-51м&sdate=03.02.2020&edate=07.02.2020";
    byte[] byteArray = System.Text.Encoding.GetEncoding("windows-1251").GetBytes(data);
    request.ContentLength = byteArray.Length;

    using(Stream dataStream = request.GetRequestStream()) 
    {
        await dataStream.WriteAsync(byteArray, 0, byteArray.Length);
    }

    WebResponse response = await request.GetResponseAsync();
    using(Stream stream = response.GetResponseStream()) 
    {
        using(StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("windows-1251"))) 
        {
            string text = reader.ReadToEnd();
            Console.WriteLine(text);
        }
    }
    response.Close();
    Console.WriteLine("Запрос выполнен...");
}

Node.JS:

const iconv = require("iconv-lite");
var axios = require("axios");
axios
    .post(
        "http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi?n=700",
        "faculty=0&teacher=&group=%CA%B2-51%EC&sdate=&edate=&n=700",
        {
            responseType: "arraybuffer",
            responseEncoding: "binary",
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            }
        }
    )
    .then(function (response) {
        let z = iconv
            .encode(iconv.decode(response.data, "cp1251"), "utf8")
            .toString();
        console.log(z);
    });

Работающий Node.JS код скинул случайный знакомый, я этот язык не знаю совсем. Как мне кажется, проблема здесь в том, что в C# HTTP клиент не умеет выполнять javascript'ы, и подгрузка необходимой мне информации осуществляется чем-то типа AJAX'а, но подтверждений этому я не смог найти. Хотелось бы узнать, в чём тут причина и по возможности методы или подсказки, как эту проблему решить. Заранее спасибо.

Коды получаемых страниц: C# проект, Node.JS проект
Отправляемые данные:
группа: КІ-51м, %CA%B2-51%EC в дебаггере;
даты: 03.02.2020 - 07.02.2020


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

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

У вас запрос идёт не по тем URL. Вот так должно работать.

public static async Task PostRequestAsync()
        {
            string faculty = "13";
            string teacher = "";
            string group = "КІ-51";
            string startDate = "01.01.2020";
            string endDate = "07.02.2020";
            string n = "700";

            string urlRequest = "http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi?n=700";
            string postData = $"faculty={faculty}&teacher={teacher}&group={group}&sdate={startDate}&edate={endDate}&n={n}";

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            WebRequest request = WebRequest.Create(urlRequest);
            request.Method = "POST";
            byte[] byteArray = System.Text.Encoding.GetEncoding("windows-1251").GetBytes(postData);
            request.ContentLength = byteArray.Length;

            using (Stream dataStream = request.GetRequestStream())
            {
                await dataStream.WriteAsync(byteArray, 0, byteArray.Length);
            }

            WebResponse response = await request.GetResponseAsync();
            using (Stream stream = response.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("windows-1251")))
                {
                    string text = reader.ReadToEnd();
                    Console.WriteLine(text);
                }
            }
            response.Close();
            Console.WriteLine("Запрос выполнен...");
        }
→ Ссылка