#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, чтобы увидеть, что на самом деле происходит.