Главная страница
Случайная страница
КАТЕГОРИИ:
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
WSDL- и WSML-файлы
WEB Service Description Language (WSDL) основан на XML и предназначен для описания тех сервисов, которые поддерживает сервер. Для каждого сервиса в WSDL-файле перечисляется набор операций, поддерживаемых данным сервисом, а также определяется формат сообщения, которого должен придерживаться клиент, чтобы сформировать правильный запрос.
WSDL-файл задает контракт между сервером и клиентом, который клиент обязан выполнять, чтобы быть обслуженным.
Основные разделы WSDL-файла:
- Схема – < schema> – описывает сложные типы данных, используемые в параметрах методов.
< types> < schema...>... < complexType name ='Recordset'>... < /complexType> < /schema> < /types>
| - Описание SOAP-сообщений – < message>
< message name='TView.GetModules'> < part name='processID' type='xsd: int'/> < /message> < message name='TView.GetModulesResponse'> < part name='Result' type='typens: Recordset'/> < /message>
| - Описание SOAP-портов и операций, которые поддерживаются этими портами:
< portType name='TViewSoapPort'>... < operation name='GetModules' parameterOrder='processID'> < input message='wsdlns: TView.GetModules'/> < output message='wsdlns: TView.GetModulesResponse'/> < /operation> < /portType>
| - Описание формата операций:
< binding name='TViewSoapBinding' type='wsdlns: TViewSoapPort' >... < operation name='ShutdownMachine'> < soap: operation.../> < input> < soap: body...parts='nFlags'/> < /input> < output> < soap: body.../> < /output> < /sopa: operation> < /operation> < /binding>
| - Описание сервисов и портов, входящих в эти сервисы:
< service name='TView' > < port name='TViewSoapPort' binding='wsdlns: TViewSoapBinding' > < soap: address location='https://ivan/TView/TView.ASP'/> < /port> < /service>
| В WSDL-файле могут быть описаны один или несколько сервисов, для каждого из которых задан свой адрес – URL. Каждый сервис включает в себя один или несколько портов. Генератор WSDL-файлов создает один порт для каждого из указанных интерфейсов COM-объекта. Каждый порт включает в себя одну или несколько операций. Если сравнивать порт с интерфейсом, то операцию можно сравнить с методом интерфейса. Каждая операция включает несколько частей. Часть (part) можно сравнить с параметром метода.
WSML-файл описывает связь операций с конкретными методами COM-объектов, которые будут обслуживать запросы. Основные разделы WSML-файла:
- Ссылки на используемые COM объекты:
< service name='TView'> < using PROGID='TView.TView.1' cachable='0' ID='TViewObject' />
| - Связь сложных типов данных с мэпперами, которые будут отвечать за преобразование сложных типов в XML:
< types> < type name='Recordset'... targetPROGID='ADODB.Recordset' iid='{00000535-0000-0010-8000-00aa006d2ea4}'/> < /types>
| - Описание связи между SOAP-операцией и методами COM-объекта:
< port name='TViewSoapPort'> < operation name='ShutdownMachine'> < execute uses='TViewObject' method='ShutdownMachine' dispID='1'> < parameter callIndex='1' name='nFlags' elementName='nFlags' /> < /execute> < /operation> < /port>
| На основе информации, содержащейся в этих файлах, компоненты SOAP Toolkit осуществляют подготовку SOAP-запросов, преобразование и передачу параметров, анализ ответа сервера.
“Здравствуй, Мир” (SOAP Edition)
Рассмотрим создание простейшего приложения, использующего SOAP.
В этом и последующих примерах мы будем использовать следующие программные средства и инструменты:
- MS VC++ 6.0 SP5 – для разработки COM-объектов.
- MS Visual Basic 6.0 и/или VBSript для разработки клиентского кода (в приложения на VB надо добавлять ссылку на SOAP Toolkit 3.0).
- IIS 5.0 – для доступа к серверным компонентам по HTTP.
- Утилиту трассировки для анализа сообщений, передаваемых от клиента серверу и обратно.
- IE – для диагностики работоспособности сервера.
- Любой текстовый редактор для работы с WSDL- и WSML-файлами.
Для начала нам понадобится небольшой компонент с единственным методом Hello, возвращающим строку “Hello, World”.
Реализация может быть такой:
STDMETHODIMP CHello:: HelloWorld(BSTR *pString) { *pString = CComBSTR(L" Hello, world").Detach(); return S_OK; }
| Теперь необходимо сгенерировать WSDL- и WSML-файлы с помощью генератора, входящего в состав SOAP Toolkit. На первом шаге мастера необходимо выбрать имя для WSDL-файла и указать компонент, на основе библиотеки типов которого будет сгенерирован WSDL.
ПРИМЕЧАНИЕ
Мастер не позволяет выбирать несколько библиотек типов одновременно, поэтому если необходимо создать один WSDL-файл для нескольких компонентов из разных библиотек, это придется делать вручную.
| На следующем шаге необходимо выбрать из библиотеки типов интерфейсы и методы, которые войдут в WSDL-файл.
ПРЕДУПРЕЖДЕНИЕ
Если методы содержат параметры, типы которых не поддерживаются генератором (например, enum), генератор вставит “??????? ” вместо типа в WSDL-файл. Перед использованием сгенерированного файла придется заменить “???? ” на один из поддерживаемых типов.
Особенно WSDL-генератор “не любит” параметры с типом IUnknown и IDispatch.
| На следующем шаге мастера необходимо указать URL, по которому будут обращаться клиенты, и выбрать тип серверного listener’а – ASP или ISAPI.
СОВЕТ
Указанный в мастере URL будет сохранен в WSDL-файле, поэтому клиент не обязан указывать URL. Ему будет нужно указать только месторасположение WSDL-файла. Поменять URL можно, отредактировав WSDL. Кроме того, клиент при подключении может указать другой URL, тем самым переопределяя значение из WSDL-файла.
| Когда файлы сгенерированы, нужно создать виртуальный каталог для IIS, в котором будут размещаться все созданные файлы.
Среди сгенерированных файлов будет ASP-страница (если в мастере был выбран ASP listener). Ниже приведен фрагмент кода этой страницы, сгенерированный мастером:
Option Explicit On Error Resume Next Response.ContentType = " text/xml" Dim SoapServer If Not Application(" Sample1Initialized") Then Application.Lock If Not Application(" Sample1Initialized") Then Dim WSDLFilePath Dim WSMLFilePath WSDLFilePath = Server.MapPath(" Sample1.wsdl") WSMLFilePath = Server.MapPath(" Sample1.wsml") Set SoapServer = Server.CreateObject(" MSSOAP.SoapServer30") If Err Then SendFault " Cannot create SoapServer object. " & Err.Description SoapServer.Init WSDLFilePath, WSMLFilePath If Err Then SendFault " SoapServer.Init failed. " & Err.Description Set Application(" Sample1Server") = SoapServer Application(" Sample1Initialized") = True End If Application.UnLock End If Set SoapServer = Application(" Sample1Server") SoapServer.SoapInvoke Request, Response, " "
| Как видно из кода, полученный сервером запрос передается специальному компоненту SoapServer30, который обрабатывает запрос и формирует ответ, возвращаемый клиенту.
СОВЕТ
SOAP Toolkit 3.0 устанавливается в режиме “Side By Side”. Чтобы обращаться к новым версиям компонентов Toolkit’а, необходимо использовать имена, оканчивающиеся на 30. Например, по Progid “MSSOAP.SoapServer” будет создана предыдущая версия (2.0) серверного компонента.
| ПРИМЕЧАНИЕ
Если в качестве SOAP listener’а выбрать ISAPI, придется добавить ISAPI-расширение к виртуальному каталогу вручную, так как программа установки SOAP Toolkit не делает этого. Добавить ISAPI-расширение к виртуальному каталогу можно с помощью скрипта, поставляемого в составе SOAP Toolkit (Binaries/_svdir.vbs). Подробнее об этом можно прочитать в readme.txt к SOAP Toolkit.
Главное преимущество ASP Listener’а по сравнению с ISAPI заключается в том, что в ASP-страницу можно добавлять свой код, изменяющий XML-запрос (например, добавить информацию, доступную через объект Session) или, например, вести лог запросов. Но ISAPI-расширение работает быстрее, чем ASP Listener.
| Чтобы пример заработал, нужно создать клиента, использующего клиентскую Proxy для доступа к серверу. Для этого напишем небольшой VB Script:
Dim o As Object Set o = CreateObject(" MSSOAP.SoapClient30") o.MSSoapInit " https://ivan/Sample1/Sample01.WSDL " o.helloworld s MsgBox s
| На первый взгляд непонятно, почему в приведенном примере мы вызываем метод серверного компонента “helloworld” у объекта с типом SoapClient30. Дело в том, что объект SOAPClient реализует динамический IDispatch, который позволяет вызывать через позднее связывание любые методы, описание которых будет обнаружено в WSDL-файлах.
СОВЕТ
WSDL-файл может находиться локально по отношению к клиенту или загружаться по протоколу HTTP (как в данном случае). Если WSDL-файл загружается по HTTP, и WEB-сервер требует аутентификации, имя пользователя и пароль необходимо передать через URL, например, https://user: pwd@ivan/Sample1/Sample01.wsdl
| Чтобы увидеть “изнутри”, как работает тестовый пример, воспользуемся утилитой трассировки, входящей в состав Toolkit’а. Для того чтобы перехватывать запросы и ответы сервера, надо поменять URL в WSDL-файле, указав там порт 8080. После этого необходимо запустить утилиту трассировки. Вызывая методы по протоколу SOAP, можно будет видеть запросы и ответы сервера. Будьте внимательны – если утилита трассировки не запущена, обращение к порту 8080 приведет к ошибке.
Рисунок 1. Утилита трассировки SOAP вызовов.
|