Главная страница
Случайная страница
КАТЕГОРИИ:
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Generic Custom Type Mapper
COM-объекты – это еще одна разновидность сложных типов данных. Для передачи таких данных SOAP Toolkit включает в себя специальный Generic Custom Type Mapper (GCTM). С ним связана неприятная особенность генератора WSDL-файлов – когда он встречает параметр метода, имеющий тип " указатель на интерфейс", генератор вставляет в WSML-файл ссылку на GCTM. Но это совсем не означает, что SOAP Toolkit поддерживает передачу клиенту объектных ссылок, напротив, GCTM использует только свойства (properties) COM-объекта, сохраняя их в XML и восстанавливая на приемной стороне. При использовании GCTM происходит следующее:
- Встречая в библиотеке типов параметр метода, имеющий тип – указатель на интерфейс, генератор WSDL-файлов рассматривает такой параметр как сложный тип, и составляет список всех свойств интерфейса. Процедура повторяется рекурсивно, если одно или несколько свойств имеют тип " указатель на интерфейс" (это может оказаться полезным для иерархий COM-объектов). Для каждого такого свойства генератор добавляет в WSML-файл его описание со ссылкой на GCTM.
- При вызове метода на передающей стороне GCTM получает значения свойств COM-объекта (get_Property) и сохраняет полученные значения в XML.
- На принимающей стороне GCTM создает COM-объект по CLSID, указанному в WSML-файле, и присваивает свойствам COM-объекта значения, переданные через XML.
- Клиенту возвращается ссылка на созданный COM-объект.
Из этого следует:
- Клиент получает копию COM-объекта, при работе с этой копией никаких вызовов по протоколу SOAP не происходит.
- Клиенту передаются только те данные, которые доступны через открытые свойства объекта, описанные в IDL.
- Если чтение/установка свойства COM-объекта имеет побочные эффекты, использование GCTM может привести к неожиданным последствиям.
- GCTM не сможет работать с параметризованными свойствами.
- GCTM не может передать клиенту свойства объекта, доступные только для чтения (read-only) или только для записи (write-only).
- Семантика работы GCTM достаточно сильно отличается от передачи клиенту объектной ссылки и даже от распространенной в мире COM техники Marshal By Value (передача по значению), так как MBV обеспечивает передачу внутреннего состояния объекта, а GCTM – только значений свойств (подразумевая, что состояние объекта полностью определяется через его свойства).
Работу с GCTM иллюстрирует следующий пример:
... interface IGCTMDataObject: IDispatch { [propget, id(1)] HRESULT Data([out, retval] BSTR *pVal); [propput, id(1)] HRESULT Data([in] BSTR newVal); };... interface IGCTMSample: IDispatch { [id(1)] HRESULT Get([out]IGCTMDataObject** pData); };
| Интерфейс IGCTMSample возвращает указатель на интерфейс IGCTMDataObject, имеющий одно read-write свойство Data.
Код клиента получает объект DataObject и читает его свойство:
Dim o As MSSOAPLib30.SoapClient30 Set o = New MSSOAPLib30.SoapClient30 o.MSSoapInit " D: ProjectsSOAPMapperSampleSrvIISMapperSampleSrv.WSDL",, _ " GCTMSampleSoapPort", _ " D: ProjectsSOAPMapperSampleSrvIISMapperSampleSrvClient.WSML" Dim p As Object o.Get p MsgBox p.Data
| Как и для UDT Mapper-а, при инициализации клиента необходимо указать местоположение WSML-файла и предоставить клиенту библиотеку типов с описанием передаваемого интерфейса. Специфика использования GCTM заключается в том, что клиент предпримет попытку создать передаваемый COM-объект, поэтому помимо библиотеки типов клиенту потребуется модуль, содержащий код компонента.
|