Главная страница
Случайная страница
Разделы сайта
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
DIME и бинарные вложения
Поскольку XML представляет собой текстовый формат, для передачи бинарных данных требуется их перекодировка, например, в кодировку base64. Это означает, что в случае передачи бинарных данных, во-первых, увеличивается время вызова, так как перекодировка в base64 занимает некоторое время, а, во-вторых, увеличивается объем данных, которые необходимо передать по HTTP.
SOAP Toolkit, начиная с версии 3.0, поддерживает новый формат HTTP-запросов, называемый DIME – Direct Internet Message Encapsulation. DIME является по сути бинарным форматом передачи данных и не требует их перекодировки. Сообщение в формате DIME представляет собой совокупность DIME-записей. Каждая запись состоит из заголовка и бинарных данных. Заголовок записи включает в себя длину записи, тип данных и идентификатор записи. Такая организация позволяет быстро найти нужную запись и прочитать данные из нее.
SOAP Toolkit использует формат DIME для передачи бинарных вложений. Преимущество передачи бинарных данных в виде вложений заключается в том, что данные будут передаваться более эффективно и на их обработку потребуется меньше времени и ресурсов.
SOAP Toolkit поддерживает 4 вида бинарных вложений:
Название объекта для работы с бинарными вложениями
| Описание
| FileAttachment30
| Позволяет передать файл.
| StringAttachment30
| Предназначен для передачи строк.
| ByteArrayAttachment30
| Передает массив байтов.
| StreamAttachment30
| Передает данные в IStream.
| Когда генератор WSDL-файлов встречает в tlb описание метода, имеющего параметром один из перечисленных выше типов, он автоматически добавляет в WSDL информацию, необходимую для передачи/приема вложений. Эта информация включает в себя описание типа:
< complexType name='UnknownBinaryContent'> < simpleContent> < restriction base='typens: ReferencedBinary'> < annotation> < appInfo> <! -- You may use one or more of the following elements to describe the binary content: < content: type value='(URI Identifing Type)' /> < content: mediaType value='(MIME Media Type)' /> < content: documentType value='(Name of XML Document Element)' /> --> < /appInfo> < /annotation> < /restriction> < /simpleContent> < /complexType> и указание использовать формат DIME в описании операции: < operation name='PutPicture' > < soap: operation soapAction= 'https://tempuri.org/AttachSvr/action/AttachSvr.PutPicture' /> < input> < dime: message layout='https://schemas.xmlsoap.org/ws/2002/04/dime/closed-layout' wsdl: required='true' />
| SOAP-запрос, включающий бинарные вложения, может выглядеть так:
<? xml version=" 1.0" encoding=" UTF-8" standalone=" no"? > < SOAP-ENV: Envelope...> < SOAP-ENV: Body...> < SOAPSDK4: PutPicture...> < Picture href=" uuid: AC3437F8-8746-4250-A204-9F8DAAA5E2D7" /> < /SOAPSDK4: PutPicture> < /SOAP-ENV: Body> < /SOAP-ENV: Envelope>
| Работа с бинарными вложениями через высокоуровневый API сводится к следующему:
- Если метод серверного компонента передает данные клиенту, параметр описывается как IFileAttachment, IStringAttachment, IByteArrayAttachment или IStreamAttachment. Мастер генерации WSDL-файлов, встретив такой параметр, добавит в WSDL всю необходимую информацию. Код сервера, передающий файл клиенту, может быть, например, таким:
STDMETHODIMP CAttachHandler:: GetFile(IFileAttachment **pAttach) { IFileAttachmentPtr spAttach(CLSID_FileAttachment30); spAttach-> put_FileName(L" D: \\as331003.zip"); *pAttach = IFileAttachmentPtr(spAttach).Detach(); return S_OK; }
| Клиент получает бинарное вложение, используя интерфейс IReceivedAttachment:
Dim o As MSSOAPLib30.SoapClient30 Set o = New MSSOAPLib30.SoapClient30 o.MSSoapInit " D: ProjectsSOAPSample2IISSample2.WSDL" Dim f As IReceivedAttachment o.GetFile f f.SaveToFile " d: \recvd"
| - Если сервер получает данные от клиента, параметр описывается как IReceivedAttachment. Получая указатель на IReceivedAttachment, сервер может сохранить вложение, например, в файл:
STDMETHODIMP CAttachHandler:: PutFile(IReceivedAttachment *pFile) { pFile-> SaveToFile(CComBSTR(OLESTR(" d: \\someattach.zip")), VARIANT_FALSE); return S_OK; }
| Клиент использует один из поддерживаемых в SOAP Toolkit видов вложений, чтобы передать данные серверу:
Dim o As MSSOAPLib30.SoapClient30 Set o = New MSSOAPLib30.SoapClient30 o.MSSoapInit " D: ProjectsSOAPSample2IISSample2.WSDL" Dim f As FileAttachment30 Set f = New FileAttachment30 f.FileName = " D: as331003.zip" o.PutFile f
| При работе с высокоуровневым API описание всех бинарных вложений появляется в WSDL-файле, и SOAP-запрос включает в себя ссылку на каждое бинарное вложение:
< SOAPSDK4: PutPicture...> < Picture href=" uuid: AC3437F8-8746-4250-A204-9F8DAAA5E2D7" /> < /SOAPSDK4: PutPicture>
| Однако существует возможность добавлять анонимные вложения (unreferenced), описания которых нет в WSDL-файле, и ссылка на которые не появляется в SOAP-запросе. Работа с такими вложениями возможна только через низкоуровневый API.
|