Разное

Webservices на foxpro: Web Services and FoxPro, Part 1…

Web Services and FoxPro, Part 1…

В этой статье :
  • Для чего написана эта статья.
  • Что такое Web Services.
  • Немного об XML и “заточки под него VFP”.
  • Простой пример получения данных посредством WS из Интернета.

Для чего написана эта статья.

В последнее время все чаще можно услышать разговоры о том, что FoxPro — это устаревшая технология 80-х, что программисты, которые остались верны данной среде разработки «отстали от жизни», что у них «нет будущего» и, вообще, «они ничего не понимают в развитии IT индустрии». ..  Прочитав эту статью, Вы научитесь применять FoxPro в глобальных масштабах всего мира. Для Вас будет абсолютно без разницы, для чего писать приложения — для маленькой задачи на одном компьютере, для целого предприятия, работающего в среде Интранет,  для  крупной компании,  спрятавшей своих клиентов за навороченными системами защиты «firewall», или для ее филиалов, разбросанных по всему миру, и имеющих разнородный парк серверов, на которых крутятся разношерстные операционные системы от Windows 2000, 2003 до Unix. Web Services размывают наши представления о различиях между файл — серверными и клиент — серверными приложениями. Теперь Вы можете передавать между компьютерами только минимально необходимый набор информации, применяя хранимые процедуры и транзакции на удаленном сервере данных, тем самым лишая многих критиков FoxPro основных аргументов против применения данной среды в современных надежных и легко масштабируемых приложениях (так как в этом случае Вам не надо ничего будет менять в клиентском приложении — только изменить немного WS).

Причем, Вы неожиданно откроете для себя, что такие феноменальные возможности появились у старого и доброго FoxPro еще много лет назад в 7 версии, намного опережая продвинутые продукты конкурентов и даже многие продукты самого Microsoft (например, SQL Server 2000). Проблема была только в Вас самих — Вы этим не пользовались. Мы очень надеемся, что данная статья Вам поможет пересмотреть Ваши взгляды на Ваш привычный процесс разработки приложений, дав толчок к внедрению новых технологий у Ваших клиентов и, в конечном итоге, к upgrade Ваших skills. В данной публикации мы попытаемся «объять необъятное», разумеется, с Вашей помощью в виде отзывов, которые помогут улучшить понимание данного материала и сделать его более понятным для тех, кто только начинает свой путь по нелегкой тропе к вершинам программистского мастерства.

Что такое Web Services.

В начале моей нелегкой жизни профессионального программиста   клиенты часто просили меня рассказать, как работает написанная мной программа. Мои объяснения сводились примерно к следующему: “Вы нажимаете кнопку «вывести на экран справочник товара», и компьютер посылает запрос к серверу в виде строки, в которой указывает то, что Вам надо. Далее сервер обрабатывает Ваш результат, формирует ответную строку и посылает ее назад. Моя программа принимает ответ и показывает Вам в удобочитаемом виде этот самый справочник…” Все были довольны: клиент тем, что понял, а я, что удалось ему объяснить.

Только через несколько лет я обнаружил, что это была голая ложь по отношению к файл – серверу. Даваемое мной описание подходит больше под КС (клиент-серверное приложение), а в идеале, на приложение, где источником данных является Web Service. Так что же все-таки это непонятное импортное словосочетание означает на самом деле? Цель моей скромной статьи — приоткрыть завесу тайны и мистики над этой технологией, которой пророчат большое будущее как Microsoft, так и их конкуренты.

С технической точки зрения Web Services (сокращенно WS) — это DLL, установленная на Вашем Web Server, которая может быть вызвана другими компьютерами, находящимися как во внутренней сети Intranet, так и во внешней сети Internet. Методы в этой DLL могут делать то же самое, что и COM сервер. Если объяснять простыми словами, то Web Service  просто очень маленькая программка, которая прослушивает определенный порт в IIS (Internet Information Server, или в простонародии “Сервер WEB”). Как мы, наверное, с Вами знаем, каждый WEB сервер имеет адрес IP (например,  у локального

127.0. 0.1) и порт (для Вашего WEB Server по умолчанию 80 ). Когда мы с Вами набираем, например, http://www.sergey.co.uk/ , то наш Browser (программа, с помощью которой Вы “гуляете по Интернету”) посылает Ваш запрос к DNS серверу, который говорит, что для данного адреса будет следуюший IP —  62.105.65.69,  и Вы направляетесь прямо туда, где находится мой сайт. Если теперь указать имя конкретного файла, имеющего расширение .WSDL, то IIS поймет, что запрос предназначен для WS, разбудит его, и последний начнет обработку нашего запроса, как самая обычная программа, запущенная удаленно – то есть на чужом удаленном (remote) компьютере.
Передав параметры WS, Вы можете запросить только интересующую Вас информацию, например, курсы валют на определенную дату, список книг в библиотеке по автору, список неоплаченных счетов… Вот собственно и все. Просто, как «Автомат Калашникова».

Немного об XML и “заточки под него VFP”.

Итак, если мы немного знакомы с Интернет — технологиями, то обмен данными там ведется с помощью протокола HTTP, который, как известно, ничего кроме символьных строк не понимает. .. Как же «выкрутиться» из данной ситуации, ведь нам надо передавать цифры, спецсимволы и даже картинки с двоичными данными? Для этого люди придумали XML (Extensible Markup Language). Для тех, кто любит изучать вещи досконально, советую посетить страничку http://www.w3.org/XML/ , где можно узнать последние новости об этом языке. Мне, как программисту баз данных, достаточно знать только то, что каждое выражение (как и в случае c HTML) окружено тэгами, причем один должен быть открывающим, а второй обязательно должен закрывать выражение. Рассмотрим простой пример в FoxPro, в котором полная поддержка XML появилась еще в 7 версии (просто выделяете данный текст программы и коприруете его в открытое окно редактора FoxPro):
* создаем простую таблицу
* не забыв при этом в директории проекта иметь файл config. fpw
* где есть строка: codepage=1251
* в этом случае все создаваемые нами файлы будут иметь
* корректную кодовую страницу для работы с русским языком
SET SAFETY OFF
CREATE TABLE TESTXML.DBF FREE  (text1 c(40), number1 N(4), memo1 M)
* вносим несколько значений
INSERT INTO TESTXML (text1,number1,memo1) VALUES ;
  ('Первая строка', 1233,'Строка в Memo поле первая'+CHR(13)+CHR(10)+;
  'Вот и вторая строка в Memo')
INSERT INTO TESTXML (text1,number1,memo1) VALUES ;
  ('Еще одна строка', 1963,'FoxPro отличает от других средства разработки'+CHR(13)+CHR(10)+;
  'приложений глубокая продуманность языка для реальной жизни.')
*
* создаем файл XML из нашей таблицы
* думаю, что описание команды CURSORTOXML Вы сможете прочитать в Help
* Остановлюсь только на параметрах, примененных мною
* "TESTXML" - имя открытой таблицы
* "myXMLfile.xml" - имя файла, в который мы хотим записать полученный результат
*  1 - создать "Element-centric XML" в этом случае получаем "правильный" XML файл
*  +8 - обернуть Memo поле в CDATA - это значит, что можно передавать и двоичные значения
*  +16 - использовать кодовую страницу курсора (в нашем случае 1251 - Russian Windows)
*  +512 - вывести результат в файл
*  0 - берем все записи
*  "1" - схема данных должна быть встроена в файл.  То есть как бы словарь данных
*        передается вместе с данными и в месте приема мы их правильно расшифровываем.
CURSORTOXML("TESTXML","myXMLfile.xml",1,8+16+512,0,"1")
* теперь просмотрим полученный файл
MODIFY FILE ("myXMLfile.xml")
* почистим за собой
CLOSE DATABASES
DELETE FILE TESTXML.DBF
DELETE FILE TESTXML.FPT
DELETE FILE myXMLfile.XML
example01.prg
В результате работы программы получаем следующий файл, который Вы должны увидеть на своих экранах:
<?xml version = "1.0" encoding="Windows-1251" standalone="yes"?>
<VFPData>
 <xsd:schema xmlns:xsd="http://www. w3.org/2001/XMLSchema" >
        <xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xsd:element name="VFPData" msdata:IsDataSet="true">
   <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
     <xsd:element name="testxml" minOccurs="0" maxOccurs="unbounded">
      <xsd:complexType>
       <xsd:sequence>
        <xsd:element name="text1">
         <xsd:simpleType>
         <xsd:restriction base="xsd:string">
          <xsd:maxLength value="40"/>
          </xsd:restriction>
         </xsd:simpleType>
        </xsd:element>
        <xsd:element name="number1">
         <xsd:simpleType>
          <xsd:restriction base="xsd:decimal">
           <xsd:totalDigits value="4"/>
           <xsd:fractionDigits value="0"/>
          </xsd:restriction>
         </xsd:simpleType>
        </xsd:element>
        <xsd:element name="memo1">
         <xsd:simpleType>
          <xsd:restriction base="xsd:string">
           <xsd:maxLength value="2147483647"/>
          </xsd:restriction>
         </xsd:simpleType>
        </xsd:element>
       </xsd:sequence>
      </xsd:complexType>
     </xsd:element>
    </xsd:choice>
    <xsd:anyAttribute namespace="http://www. w3.org/XML/1998/namespace" processContents="lax"/>
   </xsd:complexType>
  </xsd:element>
 </xsd:schema>
 <testxml>
  <text1>Первая строка</text1>
  <number1>1233</number1>
  <memo1><![CDATA[Строка в Memo поле первая
Вот и вторая строка в Memo]]></memo1>
 </testxml>
 <testxml>
  <text1>Еще одна строка</text1>
  <number1>1963</number1>
  <memo1><![CDATA[FoxPro отличает от других средств разработки
приложений глубокая продуманность языка для реальной жизни.]]></memo1>
 </testxml>
</VFPData>

Полученный результат грубо можно разбить на три части. В первой части (строке) идет объяснение, что это такое. Из всего этого нас интересует только encoding=»Windows-1251″, что собственно говорит о том, что мы правильно получили кодировку русского языка, и при приеме информации у нас не должно возникнуть проблем.

Во второй части идет описание формата данных. Можно очень грубо провести аналогию с заголовком таблиц DBF самого Visual FoxPro. Типы данных могут немного отличаться от привычных нам, так, например, для поля Memo — это все тот же string, но с очень большой длиной. Одно из преимуществ формата XML эксперты называют «human readable» — то есть возможность человека читать его  и понимать. Я очень надеюсь, что Вы принадлежите к человечеству и, соответственно, сможете понять, что там есть.

Третья часть, собственно, данные. Они будут зависеть от того, что Вы туда включили. В общем-то ничего сложного, я только хочу обратить внимание на загадочные буквы CDATA вокруг Memo полей. FoxPro позволяет зашифровывать данные на лету в формат base64,  который позволяет «оборачивать» двоичные файлы и передавать их в виде все тех же привычных для HTTP символов. По примерно такому же принципу мы передаем в электронной почте всевозможные картинки, музыку и даже видео.

Совсем не плохо для практически всего одной команды FoxPro!

Простой пример получения данных посредством WS из Интернета.

Давайте теперь, наконец, сделаем что-то практически, что — то «крутое» и глобальное. Для следующего примера Вам понадобится связь с внешним миром, то есть Internet. Подойдет даже очень медленное модемное соединение. Усложним пример тем, что источником данных будет MS SQL Server, а Web Services будут построены на основе любимого и  революционного  детища компании Microsoft — ASP.NET (если иметь в виду некоторые принципы, заложенные в  основу ASP.NET, как, например, создание предкомпилированного кода, то эта возможность была уже применена в FoxBase 20 лет назад). То есть данный пример покажет истинную независимость Вас, как разработчика, от среды.

Итак, вот код, который Вам предлагается скопировать в окно редактора FoxPro и запустить:

***********
* пример получения новостей с сайта www.sergey.co.uk
***********
SET TALK OFF
* создаем объект на основе пакета SOAP 3.0 
o=CREATEOBJECT("MSSoap.SoapClient30")
* соединяемся с удаленным источником данных
* в качестве параметра стандартного метода MSSoapInit задается URL
o.MSSoapInit("http://www.sergey.co.uk/WebModules/NewsManaer/Headlines.asmx?WSDL")
* вызываем функцию данного Web Service как самую обычную функцию FoxPro
* и не важно, что объект расположен от Вас за тысячи километров
* Данная функция запрашивет заголовки новостей
*o. getheadlines(1)
loexception=NULL && устанавливаем объект, в котором будем отлавливать ошибки
tt=''
* применяем конструкцию TRY..CATCH чтобы возможные проблемы не повлияли на наше
* приложение. В принципе все можно было "упрятать" в эту конструкцию
TRY
  tt=o.getheadlines(1)
CATCH TO loexception && если будет ошибка, то программа нам ее распечатает
  ? loexception.MESSAGE
  ? loexception.ERRORNO
ENDTRY

*? tt && если убрать здесь комментарий то на экране Вы увидите в случае успеха тип (Object)

IF ISNULL(loexception) && если не было ошибок, то продолжим
  lcXML=tt.ITEM(0).parentnode.XML && 
*  ? lcXML && если убрать здесь комментарий то на экране Вы увидите принятый Вами XML файл
*  STRTOFILE(lcXML,'aaa.xml') && можно записать XML в файл на диск
* для дальнейшей работы создаем XML Adapter
  LOCAL oXA AS XMLADAPTER 
  oXA = CREATEOBJECT("XMLAdapter")
* загружаем полученную информацию в созданный адаптер  
  oXA. LOADXML(lcXML,.F.,.T.) 
  IF USED('NEWS')
    USE IN NEWS
  ENDIF
* создаем таблицу из адаптера с названием NEWS
  oXA.TABLES[1].TOCURSOR(.F.,"NEWS")
  BROWSE && смотрим, что получили

ENDIF
* как обычно чистим за собой
RELEASE o

example02.prg

Программа собственно выполняет простую функию — запрашивает данные из удаленного источника и представляет в привычном для нас виде — в виде таблицы, с которой нам, программистам, уже можно делать все, что пожелаем. Комментарии объясняют для чего нам нужны основные операторы. Нами применены некоторые новые конструкции, но думаю, что они у Вас не вызовут проблем с пониманием. Если же нет, то пишите — поговорим о них более подробно .

В результате работы программы получим следующую «картинку»:

Обращу Ваше внимание только на одну деталь: все символьные поля имеют тип Memo. Это связано с тем, что в ASP.NET WS надо как и в SOAP указывать обязательность передачи схемы данных внутри XML файла. Нами этого не было сделано, и FoxPro по умолчанию поставил для строковой переменной максимально возможную длину. Решить эту проблему можно двумя путями: попросить разработчиков Web Servise включать схему в XML файл, или если это невозможно (что, как правило, бывает в нашей жизни), то поработать немного самим и изменить структуру полученной таблицы в месте приема. Есть еще вариант с внешним XSD файлом, но я предлагаю опустить его, чтобы не усложнять нашу и без того сложную жизнь.
Под влиянием общественности родился еще один пример, который может даже носить некоторый практический характер — получение курсов валют, публекуемых Центральным Банком России. Пример очень похож на предыдущий, так что копируйте и запускайте:
***********
* пример получения курса валют ЦБ РФ с сайта http://web. cbr.ru/
***********
SET TALK OFF
* создаем объект на основе пакета SOAP 3.0
o=CREATEOBJECT("MSSoap.SoapClient30")
* соединяемся с удаленным источником данных
* в качестве параметра стандартного метода MSSoapInit задается URL
o.MSSoapInit("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL")
* вызываем функцию данного Web Service как самую обычную функцию FoxPro
* Данная функция запрашивет курсы валют как DataSet
*o.DailyInfo()
loexception=NULL && устанавливаем объект, в котором будем отлавливать ошибки
tt=''
* применяем конструкцию TRY..CATCH чтобы возможные проблемы не повлияли на наше
* приложение. В принципе все можно было "упрятать" в эту конструкцию
TRY
  tt=o.GetCursOnDate(DATE()) && параметр - текущая дата date()
CATCH TO loexception && если будет ошибка, то программа нам ее распечатает
  ? loexception.MESSAGE
  ? loexception.ERRORNO
ENDTRY

*? tt && если убрать здесь комментарий то на экране Вы увидите в случае успеха тип (Object)

IF ISNULL(loexception) && если не было ошибок, то продолжим
  lcXML=tt. ITEM(0).parentnode.XML &&
*  ? lcXML && если убрать здесь комментарий то на экране Вы увидите принятый Вами XML файл
*  STRTOFILE(lcXML,'aaa.xml') && можно записать XML в файл на диск
* для дальнейшей работы создаем XML Adapter
  LOCAL oXA AS XMLADAPTER
  oXA = CREATEOBJECT("XMLAdapter")
* загружаем полученную информацию в созданный адаптер
  oXA.LOADXML(lcXML,.F.,.T.)
  IF USED('CURS')
    USE IN CURS
  ENDIF
* создаем таблицу из адаптера с названием CURS
  oXA.TABLES[1].TOCURSOR(.F.,"CURS")
* немного поработаем над полученной таблицей для красоты
* к сожалению в 8 версии неправильно работает команда ALTER TABLE
* по этому применим дополнительный SELECT
  IF VERSION(5)=800
    SELECT SPACE(30) AS VNAME, 0000.0 AS VNOM ,000.0000 AS VCURS , SPACE(3) AS  VCHCODE ;
      FROM CURS WHERE 2=1 ;
      INTO CURSOR NEWCURS NOFILTER ;
      UNION ALL ;
      SELECT MLINE(VNAME,1), VNOM,VCURS , MLINE(VCHCODE,1) ;
      FROM CURS
  ELSE
    ALTER TABLE CURS ALTER COLUMN VNAME C(30)
    ALTER TABLE CURS ALTER COLUMN VCHCODE C(3)
    ALTER TABLE CURS ALTER COLUMN VNOM N(5,2)
    ALTER TABLE CURS ALTER COLUMN VCURS N(8,4)
  ENDIF

  BROWSE && смотрим, что получили

ENDIF
* как обычно чистим за собой
RELEASE o
CLOSE DATABASES

example03. prg

Результат работы показан на нижеследующем рисунке (не плохой результат за пару минут работы):
Думаю, что для первой части достаточно. Мы ждем Ваших откликов и замечаний — что-то изменить, что-то добавить или, может, описать возможные проблемы…

Создание COM-компонент «среднего слоя» в среде Microsoft Visual FoxPro презентация, доклад

Слайд 1
Текст слайда:

Михаил Дроздов
http://vfpdev. narod.ru
Группа компаний ИВС, Пермь
http://www.ics.perm.ru

Создание COM-компонент «среднего слоя» в среде Microsoft Visual FoxPro


Слайд 2
Текст слайда:

Содержание

Возможности VFP в создании приложений по обработке данных
Функциональные возможности уровня VFP-базы данных
Схема сетевого обмена данными в традиционном VFP-приложении
Многослойные архитектурные решения при создании приложений по обработке данных
Схема обращения клиента к серверной компоненте через RPC (Remote Procedure Call)
Схема обращения клиента к серверу через SOAP (Simple Object Access Protocol) протокол
Шаги создания COM-компоненты в среде VFP
Код примера-теста VFP-COM-компоненты
Интерфейсы созданной нами VFP-COM-компоненты
Шаги регистрации COM-компоненты в «Службе компонент» сервера
Создание COM+ приложения
Настройка прав доступа к COM+ приложению
Компоненты поддержки VFP-COM на стороне сервера
Регистрация VFP-COM-объекта в COM+ приложении
Проверка работы VFP-COM-объекта в рамках COM+ приложения
Экспорт VFP-COM-компонент приложения для установки на стороне клиентов
Публикация COM-компоненты как Web Services
Публикация с использованием WDSL Generator из SOAP 3. 0 Toolkit
Завершение публикации и проверка работоспособности нашего Web Service
Перечень возможностей COM+ приложений, выполняющихся в «Службе компонент» сервера
Завершение COM+ приложения из VFP-кода
Настройки Активизации COM+ компоненты (Just-in-time activation)
Получение ObjectContext
Использование ObjectContext (явная схема)
Использование ObjectContext (неявная схема VFP 7.0 и выше)
Схема «работы» Stateless объекта
Некоторые сравнительные характеристики Statefull и Stateless объектов
Использование общих в рамках приложения данных
Пример кода, показывающего использование «Shared Property Manager» из «Службы Компонент»
Примеры кода, показывающего проверку роли клиента и контроль за флагами состояния в «Службе Компонент»
Пример функционального разбиения VFP-приложения в трёхслойной архитектуре
Список литературы


Слайд 3
Текст слайда:

Возможности VFP в создании приложений по обработке данных

VFP имеет «свою базу данных» с поддержкой SQL и ODBC/OLEDB драйверов к ней, что позволяет «внешним приложениям» пользоваться данными из VFP-базы данных через стандартные интерфейсы, в частности, через ADODB… Также VFP-база данных доступна в среде программирования MS VS 2003 . NET (и выше). Доступ осуществляется с использование библиотеки MS Framework .NET (1.1 и выше).
Специализированный на обработку данных объектно-ориентированный язык программирования позволяет минимальными усилиями создавать прикладные задачи, связанные с обработкой данных.
VFP имеет также «объектную модель» визуальных объектов, включающую наследование и обеспечивающих создание «интерфейса пользователя» (т.е. клиентских приложений), причём все визуальные объекты легко интегрируются с источниками данных путём простого механизма присоединения к таблицам/полям данных.
Средства программирования в VFP позволяют создавать COM-компоненты, которые могут быть использованы как VFP-приложениями, так и «внешними приложениями», допускающими использование OLE Automation объектов. Кроме того, создаваемые VFP-COM-компоненты совместимы с MTS (OS NT 4), с «Службой Компонент» (OS NT 5), также как легко могут быть опубликованы как «Web Services» для работы из-под MS IIS 5.0 (и выше)


Слайд 4
Текст слайда:

Функциональные возможности уровня VFP-базы данных

Средствами VFP-базы данных вы можете:
хранить определения для соединений с «внешними источниками» данных
создать часто используемые представления данных как к таблицам базы данных, так и к внешним источникам
реализовать «общие функции» обработки данных на «хранимых процедурах»
определить первичные ключи таблиц и установить постоянные межтабличные отношения
определить значения по умолчанию для полей (в последних версиях ключи с автоматическим приращением значений), а также маски ввода и формат отображения данных
осуществить контроль целостности данных
выполнить проверку корректности данных в полях и/или в записи
осуществить транзакционность изменений в нескольких таблицах
организовать «следственные изменения» в логически связанных таблицах
хранить описания полей/таблиц и «подвязанные» к полям классы, осуществляющие отображение данных на стороне клиента
в последних версиях программируемая событийная модель позволяет программировать «административный уровень» обслуживания базы данных
Нужно иметь ввиду и имеющуюся здесь ограничения (не все команды/функции VFP-среды поддержаны см. раздел “Unsupported Visual FoxPro Commands and Functions” в документации), в частности: не следует пытаться использовать классы (хотя формально ограничений вроде как нет) это сделает недоступным использованию VFP-базы данных через OLEDB


Слайд 5
Текст слайда:

Схема сетевого обмена данными в традиционном VFP-приложении

Если источником служит VFP-база данных, то сервер используется чисто как файл-сервер.
Выполнение кода происходит только и только на машинах клиентов…
… при этом, все требуемые для работы данные по сети доставляются каждому из клиентов.
Управление сетевым трафиком достаточно туманно… и скрыто во внутренних механизмах работы с данными среды VFP


Слайд 6
Текст слайда:

Многослойные архитектурные решения при создании приложений по обработке данных

Основное отличие в том, что в двухслойной архитектуре любой клиент имеет «прямой доступ к базе данных», в то время как в трёхслойной – нет… И «доступ к данным осуществляется только и только через слой компонент» на сервере. Как следствие, управление сетевым трафиком полностью ложится на плечи разработчика.

Двухслойная архитектура:

Трёх и более слоёная архитектура:


Слайд 7
Текст слайда:

Схема обращения клиента к серверной компоненте через RPC (Remote Procedure Call)

Обращение клиента к серверу в локальной сети осуществляется через стандартизованный механизм удалённого вызова (RPC), который предполагает наличие посредников [заместителя (proxy) + заглушки (stub)], обеспечивающих вызов. На стороне клиента в качестве посредника используется Proxy, а на стороне севера Stub… Так что именно за ними скрыты все тонкости/детали организации собственно самого вызова.


Слайд 8
Текст слайда:

Схема обращения клиента к серверу через SOAP (Simple Object Access Protocol) протокол

SOAP отправитель

SOAP получатель

Для передачи SOAP сообщений может быть использован любой коммуникационный протокол

Пример использования SOAP через HTTP-протокол:

Запрос клиента к серверу (Request)

Ответ сервера клиенту (Response)

Структура SOAP сообщения

http://msdn. microsoft.com/webservices/building/soaptk/


Слайд 9
Текст слайда:

Шаги создания COM-компоненты в среде VFP

Чтобы создать VFP-COM-компоненту, нужно проделать следующее:
Создать новый VFP-проект:

Поместить в него код, показанный на следующем слайде… (вы можете создавать OLEPUBLIC классы как в PRG-файлах, так и в VCX, проект может содержать более чем один класс)
… и откомпилировать полученное.
Чтобы убедиться, что компонента работает, выполните из окна команд следующее:


Слайд 10
Текст слайда:

Код примера-теста VFP-COM-компоненты

Завершения по любой ошибке именно функцией COMRETURNERROR() см. Q187908 в MSDN

Именно Session (с DataSession=2) и OLEPUBLIC


Слайд 11
Текст слайда:

Интерфейсы созданной нами VFP-COM-компоненты

Обратите внимание: нет ничего лишнего…


Слайд 12
Текст слайда:

Шаги регистрации COM-компоненты в «Службе компонент» сервера (создание COM+ приложения)

Запуск «Службы компонент»

Создание нового «пустого» приложения

Запускаемого на сервере

Обратите внимание: для выполнения этих действий, вам потребуются права «локального администратора» этого сервера.


Слайд 13
Текст слайда:

Настройка прав доступа к COM+ приложению

Для обеспечения прав доступа к компонентам вашего COM+ приложения следует определить пользователя, от имени которого будет запускаться ваше приложение. Такой пользователь должен обладать неограниченными правами на файлы и ресурсы, используемые COM-компонентами приложения. На мой взгляд лучший вариант следующий:
Создать «локального пользователя», например: AppRuner и придать ему права «локального администратора».
Именно такого «локального пользователя» использовать в показанных ниже диалогах.

Введите здесь «локального пользователя», обладающего правами «локального администратора»

Переустановите здесь «локального пользователя», обладающего правами «локального администратора», если вы получили проблемы ограниченных прав


Слайд 14
Текст слайда:

Компоненты поддержки VFP-COM на стороне сервера

Прежде чем пытаться зарегистрировать вашу VFP-COM-компоненту, обратите внимание на то, что должно быть установлено на сервере:
Для успешной регистрации VFP-COM-компоненты на сервере, требуется установка следующих библиотек (см. в C:\Program Files\Common Files\Microsoft Shared\VFP\): vfpt.dll [,vfpr.dll], vfp renu.dll [,vfprrus.dll], [%windir%\system32\] GDIPlus.dll, MSVCR70.dll, здесь — номер версии
Если вы используете какие-либо дополнительные VFP-средства, то полный список файлов VFP-runtime можно найти на http://fox.wikis.com/ точнее, в зависимости от версий это:
в MSDN: Q190869 INFO: Visual FoxPro 6.0 Required Run-Time Files – VFP 6
http://fox.wikis.com/wc.dll?Wiki~VFP7RuntimeFiles~VFP – VFP 7
http://fox.wikis.com/wc.dll?Wiki~VFP8RuntimeFiles~VFP – VFP 8
http://fox.wikis.com/wc.dll?Wiki~VFP9RuntimeFiles~VFP – VFP 9
Если вы используете только VFP OLEDB, то установка VFP-runtime вообще говоря не требуется, однако необходимо установить vfpoledb.dll (см. в C:\Program Files\Common Files\System\Ole DB). Последнюю версию инсталляционного пакета можно скачать с http://msdn.microsoft.com/vfoxpro/downloads/updates/default.aspx
В VFP 9 появилась функция SYS(3101 [, nCodePage]) для установки требуемой «кодовой страницы», однако, если у вас установлены VFP-runtime версии младше 9, то здесь имеются проблемы (т. е. того, что возвращает функция CPCURRENT()), как исправить положение дел в зависимости от версий описано здесь:
http://vfpdev.narod.ru/docs/mtscom_r.html#cpsolve7 – для vfp6t.dll, vfp7t.dll, vfp8t.dll
http://vfpdev.narod.ru/docs/spcall_r.html#cpsolve – для vfpoledb.dll (8.0.0.3006, 8.0.0.3117)
Для создания пакета установки в VFP 6.0 можно воспользоваться помощником (меню: tools/wizards/setup), а в VFP 7-9 приложением InstallShield Express
Установки следует производить только обладая правами «локального администратора» сервера.


Слайд 15
Текст слайда:

Регистрация VFP-COM-объекта в COM+ приложении

Собственно сама регистрация созданной в VFP многопоточной COM dll-ки тривиальна: достаточно из-под «Проводника Windows» зацепив мышкой «перетащить и отпустить» её в папку «Компоненты» нашего пока ещё пустого COM+ приложения с названием AppTestVfp.
На слайде ниже показан результат этого действия.
Обратите внимание на то: где именно на сервере расположена наша mytestvfpcom. dll, созданная как VFP-COM-компонента.


Слайд 16
Текст слайда:

Проверка работы VFP-COM-объекта в рамках COM+ приложения

Здесь слева приведён JavaScript-код обращения к нашей тестовой VFP-COM-компоненте.
Если этот код выполнить непосредственно на сервере, то при успешном создании экземпляра нашего объекта, в то время пока диалог показа результата ещё не закрыт, в окне «Службы компонент» мы можем наблюдать «активность» нашей тестовой компоненты:


Слайд 17
Текст слайда:

Экспорт VFP-COM-компонент приложения для установки на стороне клиентов

Наконец, последним шагом является получение инсталляционных файлов нашей VFP-COM-компоненты, чтобы установить последние на всех потенциальных клиентах.
Благодаря «Службе компонент» этот шаг существенно облегчён, однако предполагается, что:
На клиентах установлен как минимум Windows Installer 2.0
Также как и VFP-runtime, включая vfpt. dll
Также очевидно, что это шаг следует делать только в том случае, если вашими клиентами являются VFP (или другие) приложения, работающие в локальной сети через DCOM, в противном случае (при работе через SOAP и/или через HTTP) необходимость в этом шаге отпадает.


Слайд 18
Текст слайда:

Публикация COM-компоненты как Web Services с использованием WSDL Generator из SOAP Toolkit 3.0

Путь и файл не должны содержать русские буквы, только ANCI символы


Слайд 19
Текст слайда:

Завершение публикации и проверка работоспособности нашего Web Service


Слайд 20
Текст слайда:

Перечень возможностей COM+ приложений, выполняющихся в «Службе компонент» сервера

При работе COM-компонент на стороне сервера возникает целая серия общих для этого случая задач, таких как: вынесение отдельных задач в отдельные потоки для увеличения производительности системы в целом, контроль доступа к объектам, и т. п.
COM-компонентами, работающими в раках «Службы компонент» предоставляется целая серия дополнительных возможностей, к ним в частности относятся:
активизация на время выполнения (just-in-time activation)
общие и совместно используемые наборы свойств (shared properties)
ролевая система безопасности (role-based security)
поддержка транзакционности изменений (transactions)
поддержка асинхронных очередей сообщений (queued components)
обеспечение пула готовых к немедленному выполнению объектов (object pooling)
и др.

Ниже мы рассмотрим лишь некоторые их них…


Слайд 21
Текст слайда:

Завершение COM+ приложения из VFP-кода

Код приведённый здесь и помещённый в событие BeforeBuild класса ProjectHook, который вы должны подключить к вашему проекту, обеспечит вам автоматическое завершение COM+ приложения при перекомпиляции вашего проекта. Т.е. перед подменой прежней dll-библиотеки на новую. Это видимо первое, с чем вам придётся столкнуться на этом пути… Cм. [1] в «Списке литературы».


Слайд 22
Текст слайда:

Настройки Активизации COM+ компоненты (Just-in-time activation)

По умолчанию поддержка JIT активизации компоненты включена
Однако, она действительно необходима только в случае поддержки транзакций для ваших компонент


Слайд 23
Текст слайда:

Получение ObjectContext


Слайд 24
Текст слайда:

Использование ObjectContext (явная схема)


Слайд 25
Текст слайда:

Использование ObjectContext (неявная схема VFP 7.0 и выше)


Слайд 26
Текст слайда:

Схема «работы» Stateless объекта

См. [3] в «Списке литературы».


Слайд 27
Текст слайда:

Некоторые сравнительные характеристики Statefull и Stateless объектов

COM+ допускает использование как одного таки и другого вариантов.


Слайд 28
Текст слайда:

Использование общих в рамках приложения данных

В многопоточном варианте использования компонент (multi-threaded dll) существует проблема доступа к общим ресурсам для компонент выполняющихся в разных потоках одного и того же процесса. Чтобы в этих условиях обеспечить корректность данных (не потерять изменения и не получать непредсказуемые значения), в VFP реализовано ряд решений:
Чтобы «инкапсулировать» работу с таблицами данных в рамках экземпляра класса, в качестве базового следует использовать класс Session с DataSession=2 (см. в MSDN Q193953 PRB: COM.Dll In MTS ‘Sharing’ Data sessions Between Instances)
Относительно использования глобальных переменных в нужно иметь ввиду следующее:
во-первых, — для глобальных переменных в каждом потоке VFP образует собственный apartment, где содержит локальную копию данных (thread-local storage). Другими словами переменные, объявленные как PUBLIC, в действительности глобальны только по отношению к потоку.
во-вторых, — участки соответствующего кода можно поместить в критические секции, применяя VFP-функцию SYS(2336 [, nAction])
наконец, — можно использовать «Share Properties Manager» «Службы компонент», где применены semaphores и locks в этих целях.


Слайд 29
Текст слайда:

Пример кода, показывающего использование «Shared Property Manager» из «Службы Компонент»

См. [1] в «Списке литературы».


Слайд 30
Текст слайда:

Примеры кода, показывающего проверку роли клиента и контроль за флагами состояния в «Службе Компонент»

Пример кода в VFP 7.0 и выше показывающий использование интерфейса IContextState из comsvcs.dll для контроля за флагами состояния (consistent flag and a done flag) в COM+ приложении в случае использования поддержки транзакций:

Пример кода, показывающего проверку роли клиента в COM+ приложении в случае использования ролевой системы безопасности:

Чтобы дополнительные возможности на уровне компонент были поддержаны, необходима соответствующая настройка в окне свойств компоненты в «Службе компонент».


Слайд 31
Текст слайда:

Пример функционального разбиения VFP-приложения в трёхслойной архитектуре


Слайд 32
Текст слайда:

Список литературы

«Microsoft Transaction Server for Visual FoxPro Developers» by Randy Brown, October 1998, MSDN Visual FoxPro 6.0 Technical Articles
«Understanding COM+ with VFP, Part 1-3» by Craig Berntson in MSDN (this article is reproduced from the May 2001 issue of FoxTalk)
“COM+ and Windows 2000: Ten Tips and Tricks for Maximizing COM+ Performance” by David S. Platt in MSDN
Как «работает» multi-threaded COM компонента под MS MTS/Component Services? М. Дроздов (http://vfpdev.narod.ru/docs/mtscom_r.html — содержит код ряда примеров, позволяющих уяснить некоторые детали работы VFP-COM-компонент)


ОШИБКА 404 — Страница не найдена

jpg»>
JS-редактор Pro Бесплатный JS-редактор Выскакивать СтатусTitle Maker Цветные полосы прокрутки Пресс-релизы Отправить новость Проверка PageRank ————— Учебники и
       справочные материалы Учебник по JS Учебник по Ajax Учебник по HTML Учебник по CSS Учебник по CSS 2 JS ссылки Алфавитный список 1 Алфавитный список 2 Алфавитный список 3 Информация о функциях… Методы 2 Характеристики … Методы… Объекты … Список ключевых слов 2 Учебник по ФСО Добавить темы 1 Добавить темы 2 Добавить темы 3 Добавить темы 4 Добавить темы 5 Добавить темы 6 Добавить темы 7 Добавить темы 8 HTML-ссылки Что нового HTML-структура Организационная L Алфавитный список HTML-сущности Каскадный стиль S Таблицы стилей N Структура и R CSS-свойства Ссылка на HTML Зависимость Ссылки на CSS Руководство по Apache Руководство по MySQL Груша Ручная Руководство по PHP Учебник по Ajax #2 Учебник по Ajax #3 Учебник ASP SQL Server Тут Учебник по TCP/IP Учебник ASP № 2 Учебник ASP № 3 Учебник по сети ASP Учебное пособие по C++ Net Учебник FoxPro Учебник по HTML №2 Учебник по HTML №3 Учебник по JS Net Учебник по JS № 2 Учебник по JS №3 Руководство по MySQL №2 Руководство по PHP №2 Руководство по PHP №3 Учебник по SEO SQL-сервер №2 Учебник по SEO № 2 Учебник по SEO №3 Учебник по SEO № 4 Учебник по SEO № 5 Учебник по SEO № 6 Учебник по SEO № 7 ————— Бесплатные скрипты Фон Кнопки Калькуляторы Календари Печенье Дата и время Эквиваленты Формы Игры Графика Ссылки и подсказки Сообщения Меню и навигация Мышь и курсор Детали страницы пройти защиту свитки Текстовые эффекты Сведения о пользователе Разнообразный Зарабатывать! Онлайн помощь ————— Сторонний софт Аудио и MP3 Бизнес и фин. Улучшение рабочего стола Дом и образование Интернет-инструменты Мультимедиа и Д Разработчик программного обеспечения Утилиты Веб-авторство Игры Разное 1 Разное 2 Разное 3 Разное 4 Разное 5 Разное 6 Разное 7 Разное 8 Разное 9Разное 10 Бесплатный HTML-редактор


Страница, которую вы запрашиваете, не может быть найдена.
Вы можете воспользоваться одной из ссылок в левой части страницы.

ОШИБКА 404 — Страница не найдена

jpg»>
JS-редактор Pro Бесплатный JS-редактор Выскакивать СтатусTitle Maker Цветные полосы прокрутки Пресс-релизы Отправить новость Проверка PageRank ————— Учебники и
       справочные материалы Учебник по JS Учебник по Ajax Учебник по HTML Учебник по CSS Учебник по CSS 2 JS ссылки Алфавитный список 1 Алфавитный список 2 Алфавитный список 3 Информация о функциях… Методы 2 Характеристики … Методы… Объекты … Список ключевых слов 2 Учебник по ФСО Добавить темы 1 Добавить темы 2 Добавить темы 3 Добавить темы 4 Добавить темы 5 Добавить темы 6 Добавить темы 7 Добавить темы 8 HTML-ссылки Что нового HTML-структура Организационная L Алфавитный список HTML-сущности Каскадный стиль S Таблицы стилей N Структура и R CSS-свойства Ссылка на HTML Зависимость Ссылки на CSS Руководство по Apache Руководство по MySQL Груша Ручная Руководство по PHP Учебник по Ajax #2 Учебник по Ajax #3 Учебник ASP SQL Server Тут Учебник по TCP/IP Учебник ASP № 2 Учебник ASP № 3 Учебник по сети ASP Учебное пособие по C++ Net Учебник FoxPro Учебник по HTML №2 Учебник по HTML №3 Учебник по JS Net Учебник по JS № 2 Учебник по JS №3 Руководство по MySQL №2 Руководство по PHP №2 Руководство по PHP №3 Учебник по SEO SQL-сервер №2 Учебник по SEO № 2 Учебник по SEO №3 Учебник по SEO № 4 Учебник по SEO № 5 Учебник по SEO № 6 Учебник по SEO № 7 ————— Бесплатные скрипты Фон Кнопки Калькуляторы Календари Печенье Дата и время Эквиваленты Формы Игры Графика Ссылки и подсказки Сообщения Меню и навигация Мышь и курсор Детали страницы пройти защиту свитки Текстовые эффекты Сведения о пользователе Разнообразный Зарабатывать! Онлайн помощь ————— Сторонний софт Аудио и MP3 Бизнес и фин.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *