Как работает веб-сервис Delphi? (Добавление метода во время выполнения ??) - PullRequest
3 голосов
/ 05 апреля 2011

Я создал веб-сервис в Delphi XE, используя импортер WSDL.Delphi создал для меня модуль ITransmitter1.pas с интерфейсом ITransmitter и функцией GetITransmitter.

Для использования веб-сервиса я использую:

var Transmitter: ITransmitter;
begin
  Transmitter := GetITransmitter(True, '', nil);
  Transmitter.Transmit(Memo1.Text, OutXML);
end;

Но я нигде не вижу тела метода Transmit ...

В ITransmitter.pas я вижу:

  InvRegistry.RegisterInterface(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter#Transmit');

Если я комментирую эти строки, я получаю сообщение об ошибке «интерфейс не поддерживается».Как я вижу здесь, Delphi добавляет метод в RunTime!Как это работает ?Могу ли я добавить метод во время выполнения в мой собственный класс?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011

Если вы создали клиент веб-службы с импортером WSDL, сгенерированный код клиента вызовет метод на сервере.Фактически, метод 'body' (code) находится на сервере веб-службы.

Delphi генерирует запрос Soap на основе WSDL, а за кадром RTTI (самоанализ) используется для генерации параметров и т. Д.вызова веб-службы в формате XML.Этот XML-файл отправляется на сервер, который выполняет реализацию метода и отправляет ответ Soap.

Если вы создаете сервер веб-службы, все наоборот, в этом случае приложению Delphi, конечно, необходимо реализовать весь методтел.

1 голос
/ 05 апреля 2011

Вы на самом деле вызываете метод , определенный в интерфейсе, который, в свою очередь, наследует от IInvokable, объявленного в System.pas.

Если вы проверите свой исходный код, вы заметите, что ни один локальный объект в вашем проекте не реализует интерфейс IInvokable, который вы вызываете, потому что этот метод удаленно выполняется на сервере.

До того, как это произойдет, есть некоторый паскаль-код, используемый для создания правильного SOAP-запроса к серверу, его отправки, а затем ожидания и интерпретации ответа сервера, рассмотрим детали этой реализации. Если вам интересно узнать, как это работает, включите опцию компилятора «use debug .dcus», чтобы вы могли выполнять отладку внутри VCL / RTL.

Затем, как обычно, с помощью команды StepInto (F7) попросите отладчик выполнить метод Transmit шаг за шагом ... после некоторого ассемблера в методе TRIO.GenericStub вы попадете в метод TRIO.Generic, где пакет подготовлен и отправлен.

Для привязки btSOAP, которую я использую для написания этого ответа, соответствующая часть начинается со строки 943 в блоке Rio.pas:

    try
      FWebNode.Execute(Req, Resp);
    finally
      { Clear Outbound headers }
      FHeadersOutBound.Clear;
    end;          

THTTPReqResp.Execute затем использует функции wininet.dll для выполнения соединения, отправки и получения информации с помощью сервера.

Есть несколько уровней, с которыми вы можете углубиться в это ... насколько далеко вы хотите пойти, будет зависеть от ваших интересов, и большое количество деталей выходит далеко за рамки моего ответа здесь ... не стесняйтесь размещать больше вопросы с конкретными вопросами, которые вас интересуют.

Я не уверен, но детали могут меняться между версиями Delphi ... Я сейчас использую Delphi XE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...