Загрузка PDF в .NET 3.5 против .NET 4.6 с использованием C#

#c# #.net

#c# #.net

Вопрос:

У меня есть URL стороннего сервера, который открывает PDF-файл в браузере. Прежде чем получить доступ к pdf, запрос должен быть аутентифицирован, поэтому информация для аутентификации включена в URL. Таким образом, он принимает форму, подобную:

SERVER_IP:/runReport.jsp?amp;jrs.cmd=jrs.get_subnodesamp;jrs.authorization=YWRtaW46YWRtaW4=amp;jrs.report_sheet$Report=trueamp;jrs.catalog=/cata/catafolder/cataname.catamp;jrs.report=/cata/catafolder/container.clsamp;jrs.result_type=2amp;jrs.profile=myProfileamp;jrs.param$InputAD;1_@assignmentId=AD0000695585

jrs.authorization=YWRtaW46YWRtaW4=

к URL-адресу прикреплена информация об авторизации. Я разработал два фрагмента кода. Файл в .NET 4.6 является:

                 HttpClient client = new HttpClient();
                string param= "someparamvalue";
                string url = UrlBuilder(param);
                HttpResponseMessage message = client.GetAsync(url).Resu<
                HttpContent content = message.Content;
                System.IO.Stream stream = content.ReadAsStreamAsync().Resu<
                FileStream fs = File.Create($"exported\{param}.pdf");
                stream.CopyTo(fs);
                fs.Close();
                stream.Close();
  

И он успешно загружает PDF в папку «экспортированный».

У нас есть ограничение на выполнение этого в .NET 3.5 (.NET 4 не может быть немедленно установлен на компьютер), поэтому я попробовал это со следующим кодом в 3.5:

             string param= "someparamvalue";
            string url = UrlBuilder(param);
            string fileName = $"exported\{param}.pdf";

            WebClient wc = new WebClient();
            wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36");
            wc.Headers.Add(HttpRequestHeader.Accept, "text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
            wc.DownloadFile(url, fileName);
  

но все, что он загружает, это pdf, который 1) Не может быть открыт с помощью программы чтения pdf (появляется сообщение «Файл либо не поддерживается, либо поврежден …») 2) Я все еще могу открыть загруженный файл в «Notepad «, я вижу html для веб-страницы входа. (Таким образом, даже если информация об авторизации присутствует в URL, она все равно не аутентифицировала пользователя)

Что-нибудь, я не понимаю, как эти 2 фрагмента кода работают по-разному для одного и того же запроса? Что не так я делаю с кодом 3.5?

Комментарии:

1. Ну, в WebClient коде вы выдаете себя за браузер Chrome, добавляя User-Agent заголовок. В вашем HttpClient вы этого не делаете. Похоже, что веб-сервер был написан для представления экрана входа в систему неизвестным браузерам.

2. Что ж, в этом случае, даже если я удалю 2 строки между ними, это не повлияет на результат

3. Я рекомендую изучить запросы с помощью такого инструмента, как Fiddler, чтобы вы могли предоставить нам полезную информацию о том, что тогда отличается.

4. Я попробовал еще один способ, используя «HttpWebRequest», но результаты те же

5. Проверьте количество полученных байт и сравните с фактическим файлом. Также проверьте статус, чтобы увидеть, получаете ли вы 200. Возможно, вам потребуется использовать анализатор, такой как wireshark или fiddler, чтобы увидеть, что на самом деле происходит.