Member 14150748 Ответов: 1

Не удается получить строковый параметр в C# WS из клиента delphi


Приветствую вас!

У меня глупый вопрос, потому что я хотел бы получить некоторую помощь. Я практикую вызов веб-сервисов из Delphi7. Я тестирую его с помощью WS, сделанного в C# 2010. Это то, что я получил до сих пор:

Это веб - служба на языке Си#:
public class Service1 : System.Web.Services.WebService
{
    [WebMethod]
    public int countChars(string text)
    {
        int n = 0;
        if (text != null)
            return text.Length;
        else
            return n;
    }
}


Это веб - клиент в Delphi (просто форма с кнопкой и объектом SOAP):
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   size : Integer;
begin
   try
      size := (Serv as Service1Soap).countChars('Hello');
      ShowMessage(IntToStr(size));
   except
      on e:Exception do
      begin
         ShowMessage(e.Message);
      end
   end
end;

end.


Дело в том, что когда я действительно звоню в веб-службу, текст принимается как нулевая запись, а не слово "Привет".

Что я уже пробовал:

Я попытался перейти на PChar в Delphi. Ищу информацию в интернете. Даже читал о BTSr, но понятия не имел, как его использовать (я предполагаю, что это для COM-вещей). Интересно, почему я все время получаю нулевую строку. Что я упускаю?



Отредактированный: Похоже, у меня возникает похожая проблема с целыми числами. Попытался сделать сложение между 2 числами (4 и 5), и в результате я получаю 0.

Веб-Метод C# :
[WebMethod]
public int sumAB(int a, int b)
{ return a + b; }


Delphi вызов метода:
procedure TForm1.Button1Click(Sender: TObject);
var
   sum, a, b : Integer;
begin
   a := 5;
   b := 4;
   sum:= (Serv as Service1Soap).sumAB(a,b);
   ShowMessage(IntToStr(sum));
end;

1 Ответов

Рейтинг:
7

Member 14150748

Решенный.

Необходимо добавить строку в Service1.pas

Оригинал:

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


Новый:
initialization
  InvRegistry.RegisterInterface(TypeInfo(Service1Soap), 'http://tempuri.org/', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Service1Soap), 'http://tempuri.org/%operationName%');
  InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap), ioDocument);
end.


Как вы можете видеть, я добавил функцию "RegisterInvokeOptions".