Главная » Delphi » Рассмотрим класс TWebModule

0

Класс TWebModule содержит три компонента:

•    THTTPSoapDispatcher принимает  сообщения  SOAP  и  передает  их  вызывае

мому компоненту (invoker), указанному в его свойстве Dispatcher.

•  THTTPSoapPascalInvoker принимает сообщение, переданное компонентом THTTPSoapDispatcher. Именно он  указывается в свойстве Dispatcher. По лучив сообщение SOAP, этот  компонент интерпретирует его,  а затем  обраща ется к вызываемому (invokable) интерфейсу, связанному с данным  сообщением.•  TWSDLHTMLPublish используется  для  публикации  списка  документов  WSDL, содержащих информацию об интерфейсах, доступных  для вызова, что  позво ляет  клиенту, отличному  от  Delphi, выявлять и использовать методы, доступ ные через эту Web службу.

На данном этапе разработки Web модуль не задействован. Но вызываемый интер

фейс необходимо определить и реализовать.

Рис. 20.2. Созданный мастером Web модуль

Определение вызываемого интерфейса

Создайте новый модуль и разместите в нем определение интерфейса. Листинг 20.1 демонстрирует  исходный код  модуля,  созданного для демонстрационного приложе ния,  содержащегося на прилагаемом CD. Этот  модуль находится в файле TempCon- verterIntf.pas.

Листинг 20.1. TempConverter.pas — определение  вызываемого интерфейса

unit TempConverterIntf;

interface type

ITempConverter = Interface(IInvokable)

[‘{6D239CB5-6E74-445B-B101-F76F5C0F6E42}’]

function FahrenheitToCelsius(AFValue: double): double;

stdcall;

function CelsiusToFahrenheit(ACValue: double): double;

stdcall;

function Purpose: String; stdcall;

end;

implementationuses

InvokeRegistry;

initialization

InvRegistry.RegisterInterface(TypeInfo(ITempConverter));

end.Этот  небольшой модуль содержит только  интерфейс, который определяет мето ды, подлежащие публикации в качестве функций создаваемой Web службы. Обратите внимание: данный интерфейс является потомком интерфейса IInvokable. Базовый интерфейс IInvokable очень  прост.  Он  компилируется с директивой {М+}, гаран тирующей, что  все  его  потомки будут содержать информацию RTTI.  Это  позволит Web службам и клиентам правильно понимать код и символьную информацию, кото рой они обмениваются друг с другом.

В данном  примере определены два метода  применяемые для пересчета температу ры,  а также  метод  Purpose(), который возвращает строку.  Обратите внимание, это му интерфейсу был присвоен GUID (глобальный уникальный идентификатор). Чтобы в редакторе кода  создать  подобную  уникальную  последовательность, достаточно на жать комбинацию клавиш <Ctrl+Shift+G>.

CОВЕТ

Каждый метод вызываемого интерфейса определен как соответствующий соглашению о вызовах stdcall. Это необходимо, в противном случае вызываемый интерфейс ра- ботать не будет.

И, наконец, последними из упомянутых  элементов являются пользователь модуля InvokeRegistry и вызов  метода  InvRegistry.RegisterInterface(). При  пере даче сообщения SOAP компонент THTTPSoapPascalInvoker должен  быть  способен обнаружить вызываемый интерфейс.  Обращение к  методу  RegisterInterface() зарегистрирует интерфейс в реестре вызовов (invocation registry).  При  рассмотрении кода клиента (несколько позже) можно  будет заметить, что вызов  метода  Register- Interface() осуществляется и  на  клиенте.  Регистрация  сервера  обязательна,  по скольку для обращения к интерфейсу необходимо найти его реализацию. На клиенте этот  метод используется для того,  чтобы  позволить компонентам обнаружить инфор мацию  о  вызываемом интерфейсе  и  о  том,  как  его  вызвать. Расположение вызова функции  RegisterInterface() в блоке  инициализации  гарантирует обращение к нему при запуске службы.

Реализация вызываемого интерфейса

Реализация вызываемого интерфейса ничем  не отличается от реализации любого другого  интерфейса. В листинге 20.2 приведен исходный код интерфейса пересчета температуры.

Листинг 20.2. TempConverterImpl.pas — реализация вызываемого интерфейса

unit TempConverterImpl;

interface uses

InvokeRegistry, TempConverterIntf;

type

TTempConverter = class(TInvokableClass, ITempConverter)

public

function FahrenheitToCelsius(AFValue: double): double;

stdcall;

function CelsiusToFahrenheit(ACValue: double): double;

stdcall;

function Purpose: String; stdcall;

end;

implementation

{ TTempConverter }

function TTempConverter.CelsiusToFahrenheit(ACValue: double):

double;

begin

// Tf = (9/5)*Tc+32

Result := (9/5)*ACValue+32;

end;

function TTempConverter.FahrenheitToCelsius(AFValue: double):

double;

begin

// Tc = (5/9)*(Tf-32)

Result := (5/9)*(AFValue-32);

end;

function TTempConverter.Purpose: String;

begin

Result := ‘Temperature converstions';

end;

initialization

InvRegistry.RegisterInvokableClass(TTempConverter);

end.

Во первых, обратите внимание на то, что реализация интерфейса является потом ком класса  TInvokableClass. На  это  существуют  две причины. Обе  они  описаны в интерактивной справочной системе Delphi  6:•   Реестр вызовов (InvRegistry)  способен создать  экземпляры класса  TInvo- kableClass (поскольку он имеет  виртуальный конструктор), а следовательно, и его потомки тоже.  Это  позволяет реестру обеспечивать вызываемый интер фейс  в приложении Web службы  экземпляром вызываемого класса,  который способен обрабатывать входящий запрос.

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

Кроме  того,  можно  заметить, что  класс  TTempConverter реализует интерфейс ITempConverter. Реализация методов пересчета температуры очевидна и объясне ний не требует.

В разделе инициализации обращение к методу  RegisterInvokableClass() ре гистрирует класс TTempConverter в реестре вызовов. Это  необходимо осуществить только  на сервере, чтобы  Web служба была  способна вызвать соответствующую реа лизацию интерфейса.

Вот и все, что нужно было сделать  для создания простой Web службы. На этом  этапе можно  откомпилировать Web службу и поместить полученный в результате файл в испол няемый  каталог   Web сервера  (IIS  или   Apache).  Как  правило,  исполняемый  каталог (каталог, обладающим правом на исполнение кода) называется \Scripts или \cgi-bin.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии