Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.