Delphi клиент и сервис ASMX. Данные не получены Операцией - PullRequest
0 голосов
/ 24 сентября 2011

У меня есть простая служба ASMX, использующая Visual Studio 2010. У меня есть простая клиентская прикладная программа (форма), использующая Delphi 7. Я использовал WSDLImport для создания файла прокси, который содержит все определения типов и операции службы. Вот код для файла WebService11.pas.

 unit WebService1;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  WebService1Soap = interface(IInvokable)
  ['{3392229C-09D2-6D56-CE62-6850ABB2629D}']
    function  Add(const a: Integer): Integer; stdcall;
    function  Subtract(const a: Integer; const b: Integer): Integer; stdcall;
  end;

function GetWebService1Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WebService1Soap;


implementation

function GetWebService1Soap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WebService1Soap;
const
  defWSDL = 'http://localhost/DelphiTest/WebService1.asmx?wsdl';
  defURL  = 'http://localhost/DelphiTest/WebService1.asmx';
  defSvc  = 'WebService1';
  defPrt  = 'WebService1Soap';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as WebService1Soap);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(WebService1Soap), 'http://tempuri.org/', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WebService1Soap), 'http://tempuri.org/%operationName%');

end

.

Ниже приведен файл, содержащийся в файле Unit1.pas, который является фактическим кодом формы.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WebService1, InvokeRegistry, Rio, SOAPHTTPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    HTTPRIO1: THTTPRIO;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var c : integer;
begin
    c := GetWebService1Soap(False,'',HTTPRIO1).Add(10);
    ShowMessage(IntToStr(c));
    end;
end.

Клиент Delphi запускает службу ASMX, как и ожидалось. Однако я не вижу данные, отправленные в качестве параметра в операции «Добавить». Я поместил разрыв в исходный код службы ASMX и проверил значение параметра, равное нулю.

Я использовал fiddler для чтения сообщения, отправленного клиентом delphi, но я не вижу входящее сообщение SOAP. Я вижу данные SOAP, отправленные обратно службой ASMX, которые являются целочисленными значениями. Это целочисленное значение не получено клиентом SOAP.

Мне нужно понять следующее:

1) Есть ли другой способ прочитать, что отправлено и получено клиентом delphi. Я знаю, что в Delphi есть компонент HTTPRIO1, но я не знаю, как получить от него данные запроса и ответа.

2) Что я здесь не так делаю.

* Пожалуйста, не говорите, что я еще не эксперт в Delphi 7. Я в основном пытаюсь заставить клиента Delphi общаться со службой ASMX. Я мог бы использовать WCF, но есть некоторая сложность, с которой я столкнулся, поэтому необходимо понять, могу ли я заставить клиента Delphi общаться со службой ASMX на основе SOAP 1.1

Добавлено позже: Я каким-то образом собрал сообщения SOAP с запросами и ответами через fiddler 2.

Запрос SOAP-сообщения:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <NS1:Add xmlns:NS1="http://tempuri.org/">
           <a xsi:type="xsd:int">10</a>
    </NS1:Add></SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ответное SOAP-сообщение:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<AddResponse xmlns="http://tempuri.org/">
<AddResult>2</AddResult>
</AddResponse>
</soap:Body>
</soap:Envelope>

1 Ответ

0 голосов
/ 25 сентября 2011

Я исправил проблему.Это было в основном из-за формата SOAP, который не был совместим с WCF.Я преобразовал формат SOAP в «Документ / Литерал».Пожалуйста, прочитайте мою другую ветку Как установить THTTPRio.Converter.Options для soLiteralParams в OnBeforeExecuteEvent

...