Статья: Web Services и MS Visual FoxPro Часть 3

В этой статье :
Подробное создание прототипа Web Service.
Создадим прототип Web Service. Этот WS будет иметь то же название, что и реальный, с одной лишь разницей - у него будет всего один метод (процедура), котрый будет возвращать 1. Здесь мы подробно опишем, как его создать, опубликовать и проверить его работу. Далее при создании WS для нашего реального проекта мы опустим все эти подробности. Мы надеемся, что такой подход упростит понимание рассматриваемой технологии.
1. Создадим директорий на Вашем компьютере C:\WS_MESSAGE\SERVER

2. Создадим в этом директории программу с именем ws_server.prg , поместив туда следующий код:

*/--------------------------------------------------------------------------/*
*
* MS VFP version..: 9.0 (так как применим новые данные совместимые с SQL Server)
* Program-ID......: WS_SERVER.PRG
* Purpose.........: Непосредственно WEB Service
* Project Manager.:
* Programmer......: Sergey Chavlytko
* Start...........: 23/05/2005
* Last edited.....: 23/05/2005
*
* (С) www.sergey.co.uk 2005
*/--------------------------------------------------------------------------/*

DEFINE CLASS WS_MES_SERVER AS SESSION OLEPUBLIC

  PROCEDURE INIT && процедура, выполняемая при вызове Web Service
* Вы можете писать сюда все что Вам необходимо для инициализации работы программы
* Например, глобальные переменные 

  SET DELETED ON
  SET DATE DMY
  SET EXCLUSIVE OFF
  SET MULTILOCKS ON
  SET REPROCESS TO 1000
  SET STRICTDATE TO 0

*!* If you do any work with SQL Pass-Through
*!* these settings are a good idea.
  SQLSETPROP(0,"DispLogin",3)
  SQLSETPROP(0,"DispWarnings",.F.)
  ENDPROC


* это и есть наш тестовый пример
  PROCEDURE test() AS INTEGER
  RETURN (1)
  ENDPROC

ENDDEFINE

3. Cоздадим новый проект с названием ws_server и добавим туда созданную ранее программу ws_server.prg. По умолчанию этот модуль примет статус MAIN (то есть главный), что нам и надо:

Окно проекта.
4. Построим проект как multi-threaded COM server (DLL):
Выбрать multi-thread DLL при построении проекта.

Вот мы и получили DLL, готовую к построению Web Service. К сожалению, пока у нас нет возможности использовать для создания нашего класса визуальные средства, так что приходится все писать руками в коде. Замечу еще, что наш класс на базе session должен быть определен как OLEPUBLIC.

Сразу проведем тестирование созданной DLL. Для этого в командном окне наберем следующий код (набирается одна строка, затем она выполняется, затем следующая и т.д.):

o=CREATEOBJECT('WS_SERVER.WS_MES_SERVER') ? o.test RELEASE o

Если у Вас все правильно, то на экране получим результат работы программы 1.

И, наконец, пришло время опубликовать (или преобразовать обычной DLL в WS) наш первый Web Service. Для этого:

1. Нажмем правую клавишу мышки в окне проекта на имени нашей программы:

Выбрать Builder.
2. Появится окно Wizard Selection, в котором следует выбрать Web Services Publisher:
Выбрать Web Services Publisher.
3. После этого может появиться предупреждающее сообщение с короткими инструкциями, что надо делать (просто ответьте OK). Следующим появится Web Services Publishing  диалог:
Web Services Publishing диалог.
4. Выбираем Advanced Button (на предыдущем рисунке эта кнопка обведена красным). Появляется диалог для определения места, где будет находиться создаваемый Web Service:
Выбор места для Web Service.
5. Для первого раза выберем  место New, изменим File Output Path и New Virtual Directory Name, как на следующем рисунке (и заодно выберем пункт Set selected URL as default Web service location, чтобы при последующих публикациях Web Service съэкономить наше время). Для выполнения наших инструкций нажимаем кнопку Create:
Установки для создания виртуального директория.
6. После непродолжительной работы компьютера появляется экран в котором мы еще раз все сможем поменять (выбираем ISAPI - вроде как такой способ "прослушки" работает быстрее, чем ASP):
Непосредственно экран публикации WS.
7. В принципе, все у нас выбрано правильно. Рекомендую только заглянуть во вкладку Methods:
Выбор необходимых методов WS.
8. Дело в том, что позже, при создании новых методов в программе, они не будут автоматически выбираться построителем. Сейчас у Вас выбран единственный метод test. В будущем Вам надо будет делать это самостоятельно через эту вкладку (здесь же можно будет отключать неиспользуемые методы). Нажимаем кнопку OK. Возвращаемся в начальное окно публикации WS. Теперь надо нажать кнопку Generate:
Нажать сгенерировать WS.
9. Если у Вас все прошло нормально, то получите примерно такое системное сообщение:
Сообщение об удачности публикации WS.

Ну вот и все! Не смотря на обилие рисунков, система в общем-то простая и прямолинейная. Сделав один раз, Вы сможете это повторять уже много раз без подсказок.

Осталось проверить работу данного Web Service. Как и в примере с проверкой COM DLL , наберите следующие команды в командном окне VFP:

o=CREATEOBJECT("MSSoap.SoapClient30")
o.MSSoapInit("http://sergey04/ws_server/ws_mes_server.WSDL")
? o.test
release o

Если Вы получили на экране снова нашу любимую цифру 1 - это значит, что первый созданный Вами Web Service (и опубликованный пока что в Intranet) работает. Вот так незаметно для постороннего глаза Вы и научились программировать в глобальном масштабе.

Думаю, что для этого раздела достаточно. Теперь попробуем описать что делать, если что-то не работает.

Возможные проблемы.

Автор данной статьи имеет сравнительно небольшой опыт в решении проблем (всего 5 лет), так как технология довольно молодая и в общем-то неплохо спроектирована. Если сравнивать количество отказов с .NET framework, то в последней было гораздо больше проблем и беспричинного отказа, который решался только удалением данной надстройки путем подачи команды aspnet_regiis.exe -ua  , а затем полной регистрации aspnet_regiis.exe -i , благо что MS предусмотрел все заранее. С SOAP 3.0 данный фокус, увы, не проходит. Если что-то стало неправильно работать, то простой переустановкой данного пакета ничего не добьешся - надо чистить регистр (regedit команда в окне RUN). Трудное это дело и, думаю, что до него у Вас не дойдет.

В данном разделе рассмотрим мелкие проблемы, которые могут возникнуть при совместной работе SOAP и IIS. Картинки будут с IIS 5.1 (WIndows XP professional), но в IIS 5.0, который есть в Windows 2000, они аналогичны. К сожалению, ничего не могу сказать про IIS 6.0 (Windows 2003), так как автору не удалось заставить в нем работать пакет SOAP 3.0 (несмотря на личные заверения Rick Strahl и мою полемику с ним в форуме UT, что все должно работать).

Итак, откроем Internet Information Services (выбрав свойства виртуального директория, где находится наш Web Service). У меня примерно вот такая картинка:

Окно нашего проекта в IIS.
Построитель должен создать Application для нашего приложения. Если этого не произошло, то это можно сделать "вручную" (вместо кнопки Remove будет кнопка Create). Для решения глобальной проблемы  с Web Service - остутствие вызова по умолчанию обработчиков файлов с расширением WSDL - откроем окно Configuration:
Окно конфигурации расширений.
Если указанной строки нет, то ее надо добавить:
Добавление строки для WDSL (SOAP 3.0).

Причем для Executable Microsoft рекомендует внести строку: 

"c:\progra~1\common~1\mssoap\Binaries\SOAPIS30.dll"
(Особенно это касается Windows 2000, который не понимает пробелов в именах файлов и пути в этом окне ввода). Вот собственно и все. Теперь должно работать.