Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2021, 19:48   #1
Ярослав Ваганов
 
Регистрация: 09.12.2021
Сообщений: 7
По умолчанию Заголовки HTTP в полученном файле

Приветствую, может кто-то поможет мне в решении вопроса.

запрашиваю файл из сервиса вот таким образом

Код:
try
            {
                var service = "тут урл";
                var xmlData = $@"<soapenv:Envelope xmlns:soapenv=""схема"" xmlns:ws=""сервер/"">
                                    <soapenv:Header/>
                                     <soapenv:Body>
                                         <ws:getAttachment>
                                             <authInfo>
                                                <orgId>5400</orgId>
                                                <system>123</system>
                                                <user>**********</user>
                                                <password>**********</password>
                                             </authInfo>
                                             <request>
                                                <mailGWlogid>{fileId}</mailGWlogid>
                                             </request>
                                         </ws:getAttachment>
                                     </soapenv:Body>
                                 </soapenv:Envelope>";

                var httpWebRequest = (HttpWebRequest)WebRequest.Create(service);
                httpWebRequest.ContentType = $@"text/xml;charset=""utf-8""";
                httpWebRequest.Method = "POST";
                byte[] bytes = Encoding.ASCII.GetBytes(xmlData);
                httpWebRequest.ContentLength = bytes.Length;
                httpWebRequest.Timeout = 100000;

                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(xmlData);
                }

                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
 
                using (Stream str = httpResponse.GetResponseStream())
                {
                    using (FileStream fs = File.Create($@"c:\Get_files1\b{FileName}.zip"))
                    {
                        const int bufferSize = 1024;
                        byte[] buffer = new byte[bufferSize];

                        int bytesRead = 0;
                        do
                        {
                            bytesRead = str.Read(buffer, 0, bufferSize);

                            fs.Write(buffer, 0, bytesRead);
                        }
                        while (bytesRead != 0);
                    }
                }

            }
            catch (WebException ex)
            {
                HttpWebResponse httpResponse = (HttpWebResponse)ex.Response;
                if (ex.Response != null)
                {
                    using (Stream stream = ex.Response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                        MessageBox.Show(reader.ReadToEnd());
                    }
                }
            }
Всё нормально скачивается, но сам файл внутри выглядит вот таким образом.

Код:
--uuid:1fbb3ebf-a00f-4b9a-948e-595ff01985ea
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap=,kf ,kf ,kf"><soap:Body><ns2:getAttachmentResponse xmlns:ns2="сервер"><attachment><attachmentName>b0105003.011</attachmentName><checkSum>639172493</checkSum><attachmentData><xop:Include xmlns:xop="что-то там" href="cid:c0194020-39c4-4374-8e5a-ccf085ff7c84-95"/></attachmentData></attachment></ns2:getAttachmentResponse></soap:Body></soap:Envelope>
--uuid:1fbb3ebf-a00f-4b9a-948e-595ff01985ea
Content-Type: application/zip
Content-Transfer-Encoding: binary
Content-ID: <c0194020-39c4-4374-8e5a-ccf085ff7c84-95@ (c0194020-39c4-4374-8e5a-ccf085ff7c84-95/)>
Content-Disposition: attachment;name="b0105003.011"

тут зип -файл

--uuid:1fbb3ebf-a00f-4b9a-948e-595ff01985ea
Прикрепляются заголовки и soap информация

можно как-то вытянуть конкретный зип, который внутри или хотя бы заголовки убрать? Может получать посылку надо как-то по другому ? Я себе уже голову сломал (((

Последний раз редактировалось Ярослав Ваганов; 09.12.2021 в 19:51.
Ярослав Ваганов вне форума Ответить с цитированием
Старый 10.12.2021, 00:46   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Похоже на "multipart/*" (когда в одном ответе несколько находится), можно у httpResponse заголовки посмотреть на предмет Content-Type, чтобы наверняка.
Есть ли что-то встроенное для чтения - не в курсе.
Может метод-расширение ReadAsMultipartAsync поможет: https://docs.microsoft.com/en-us/pre...34957(v=vs.118)

что-то в духе:
Код:
var httpContent = new StreamContent(httpResponse.GetResponseStream());
var multipart = httpContent.ReadAsMultipartAsync().Result;
multipart.Contents[0] // тут какой-нибудь StringContent с xml-содержимым будет
multipart.Contents[1] // тут по идее StreamContent с архивом
либо читать как там этот multipart кодируется по стандарту HTTP и вручную пропускать ненужные байты в ответе.
Ну, либо использовать WCF, чтобы она по wsdl создало обёртки и этим всем низкоуровневым не нужно было заниматься.
pu4koff вне форума Ответить с цитированием
Старый 10.12.2021, 09:22   #3
Ярослав Ваганов
 
Регистрация: 09.12.2021
Сообщений: 7
По умолчанию

"StreamContent" не содержит определения "ReadAsMultipartAsync", и не удалось найти доступный метод расширения "ReadAsMultipartAsync", принимающий тип "StreamContent" в качестве первого аргумента

Забыл написать, использую .Net 4.8, winForms. Ваш пример, наверное для Core

Последний раз редактировалось Ярослав Ваганов; 10.12.2021 в 09:25.
Ярослав Ваганов вне форума Ответить с цитированием
Старый 10.12.2021, 10:22   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Через NuGet нужно поставить библиотеку: Microsoft.AspNet.WebApi.Client
https://www.nuget.org/packages/Micro...WebApi.Client/
Появится такой метод расширения.
pu4koff вне форума Ответить с цитированием
Старый 10.12.2021, 11:05   #5
Ярослав Ваганов
 
Регистрация: 09.12.2021
Сообщений: 7
По умолчанию

Спасибо! Попробую.
Ярослав Ваганов вне форума Ответить с цитированием
Старый 10.12.2021, 11:28   #6
Ярослав Ваганов
 
Регистрация: 09.12.2021
Сообщений: 7
По умолчанию

видимо всё таки это не то

Во входящем ответе заголовок Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"(

ArgumentException: Invalid 'HttpContent' instance provided. It does not have a content-type header value. 'HttpContent' instances must have a content-type header starting with 'multipart/'.

Может его как XML скачать? Но в стринг ответ не засунешь, слишком большой...

Вариант у меня есть - скачать весь файл, но не побайтово, а как текст, а потом с ним работать, только я не знаю как его скачать не побайтово, а текстом ((

Последний раз редактировалось Ярослав Ваганов; 10.12.2021 в 11:36.
Ярослав Ваганов вне форума Ответить с цитированием
Старый 10.12.2021, 11:53   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Можно наверно ещё попробовать поиграться с заголовками запроса.
SOAP-серверы вроде ожидают наличие заголовка SOAPAction.
Может ещё в Accept можно указать "application/zip" и может тогда сервер пришлёт только архив, без xml-части.
Чтобы текстом прочитать, нужно Stream засунуть в StreamReader. В блоке catch же есть это.
Но zip так не прочитается, т.к. в нём не печатные символы есть и всё это разнесёт.
pu4koff вне форума Ответить с цитированием
Старый 10.12.2021, 12:27   #8
Ярослав Ваганов
 
Регистрация: 09.12.2021
Сообщений: 7
По умолчанию

А где этот accept? В самом запросе?

>>Но zip так не прочитается, т.к. в нём не печатные символы есть и всё это разнесёт.
Согласен, гиблое дело.
Ярослав Ваганов вне форума Ответить с цитированием
Старый 10.12.2021, 13:09   #9
Ярослав Ваганов
 
Регистрация: 09.12.2021
Сообщений: 7
По умолчанию

В общем попробовал, вэб служба гссоучреждения на заголовки не реагирует (кто б мог ожидать другого), буду пока копать, может кто ещё откликнется на мою проблему (
Ярослав Ваганов вне форума Ответить с цитированием
Старый 14.12.2021, 16:47   #10
Ярослав Ваганов
 
Регистрация: 09.12.2021
Сообщений: 7
По умолчанию

Может всё таки кто-то занимался вытягиванием вложения из входящего soap ответа сервера?
Ярослав Ваганов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как распарсить распарсить HTTP заголовки Андрей Цапко C/C++ Сетевое программирование 1 10.08.2017 11:57
Как узнать собcтвенные http заголовки в php Илья 12 PHP 2 10.10.2011 20:26
Парсить HTTP Заголовки jasy Работа с сетью в Delphi 2 07.10.2011 16:00
HTTP заголовки, вебсервер на сокетах - нужна информация Lime Работа с сетью в Delphi 7 08.03.2011 21:52
http-заголовки и их возможности Maxsim H. PHP 4 04.11.2009 14:14