Студопедия

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

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

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






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 вызовов.






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