Delphi клиент для web service ASP.NET

Skiff
Дата: 19.10.2006 07:56:00
Возникла следующая проблема.

Создал ASP.NET web service. На С# написал клиента.
Тут все просто - добавил WebReference и вперед. Естественно все работает.

Появилась необходимость написать клиента на дельфи.
И вот тут возникла проблема - методу передаются пустые параметры.

Использовал и HTTPRio компонент и RemObject SDK.
При вызове перехватывал SOAP сообщение - в нем значения параметров присутствуют.

Для пробы взял сервис центробанка [url=http://]www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx[/url]
неписал пробного клиента.
и как это не странно методы вызываются и параметры передаются.
Т.е. кажется мне что чего то в самом сервисе не достаточно (атрибутов и т.п.).


Код в студию при необходимости приведу :)
Буду благодарен за подсказку.
Skiff
Дата: 20.10.2006 08:36:03
Это SOAP Message, которое отправляет клиент на C#

<?xml version="1.0" encoding="utf-8" ?> 
 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" mlns:xsi="http://www.w3.org/2001/XMLSchema-instance" mlns:xsd="http://www.w3.org/2001/XMLSchema">
 <soap:Body>
 <GetAuthorizationTicket xmlns="http://server/Informer/">
  <inParam>1222</inParam> 
  </GetAuthorizationTicket>
  </soap:Body>
  </soap:Envelope>

Это его header
 <HTTPHeaders>
  <user-agent>Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.42)</user-agent> 
  <vsdebuggercausalitydata>uIDPo2GmnOjgd3tAkQqJzryuvQcAAAAALMmY4LE8LUSnvB+8ny+7GKRH0aKYSyRClZ/Dexpd4mgACAAA</vsdebuggercausalitydata> 
  <content-type>text/xml; charset=utf-8</content-type> 
  <soapaction>"http://server/Informer/GetAuthorizationTicket"</soapaction> 
  <host>localhost:3677</host> 
  <content-length>354</content-length> 
  <expect>100-continue</expect> 
  <connection>Keep-Alive</connection> 
  </HTTPHeaders>

Это сообщение, которое шлет клиент дельфи (компонент THTTPRio, wsdl сгенерировал wsdl importer)

<?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:GetAuthorizationTicket xmlns:NS1="http://localhost:3677/webservice">
  <inParam>11111</inParam> 
  </NS1:GetAuthorizationTicket>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

Гуру web service`ов может кто подскажет что можно сделать с этим компонентом
Журавлев Денис
Дата: 20.10.2006 11:20:59
Skiff
Возникла следующая проблема.

Создал ASP.NET web service. На С# написал клиента.
Тут все просто - добавил WebReference и вперед. Естественно все работает.

....

http://www.sql.ru/forum/actualthread.aspx?tid=320436&hl=wsdl#2944722


http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL
Там используется .net DataSet, рекомендую взять Delphi2006 и писать под .Net.
Skiff
Дата: 20.10.2006 13:58:46
Журавлев Денис
Skiff
Возникла следующая проблема.

Создал ASP.NET web service. На С# написал клиента.
Тут все просто - добавил WebReference и вперед. Естественно все работает.

....

http://www.sql.ru/forum/actualthread.aspx?tid=320436&hl=wsdl#2944722


http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL
Там используется .net DataSet, рекомендую взять Delphi2006 и писать под .Net.


Это сообщение прочетно было.
Вот если б я не смог получить этот пресловутый курс валют у центробанка - було бы понятно, чо подход в корне не верен.

Но курс то я получаю! Поэтому и говорю, что чего то в сервисе моем не достаточно. Или типы использую я не те. Вот в этом то и состоит проблема.

Или я не о том?
Журавлев Денис
Дата: 20.10.2006 15:08:54
Skiff
Но курс то я получаю! Поэтому и говорю, что чего то в сервисе моем не достаточно. Или типы использую я не те. Вот в этом то и состоит проблема.

Или я не о том?
Прошу прощения прочитал по диагонали, поэтому не понял.
Хочется увидеть код (описание вебфункции) сервиса на c#. И код обертки сгенеренной делфи.
Skiff
Дата: 20.10.2006 16:54:53
Код метода webservice следующий (полезный код я выкинул, ибо он сейчас и не выполняется. Я пытаюсь банально вернуть входящий параметр)
    /// <summary>
    /// Авторизация
    /// </summary>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    /// <returns></returns>
    [WebMethod(Description = "Авторизация")]
    public string GetAuthorizationTicket(int inParam)
//    public string GetAuthorizationTicket(string userName, string password)
    {
        string message = Convert.ToString(inParam);
        return "Параметры:  " + message;

    }
Вот код сгенеренный импортером
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://localhost:3677/WebService/AuthService.asmx?wsdl
// Encoding : utf-8
// Version  : 1.0
// (19.10.2006 22:14:07 - 1.33.2.5)
// ************************************************************************ //

unit AuthService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:int             - "http://www.w3.org/2001/XMLSchema"
  // !:string          - "http://www.w3.org/2001/XMLSchema"



  // ************************************************************************ //
  // Namespace : http://localhost:3677/webservice
  // soapAction: http://localhost:3677/webservice/GetAuthorizationTicket
  // transport : http://schemas.xmlsoap.org/soap/http
  // binding   : AuthServiceSoap
  // service   : AuthService
  // port      : AuthServiceSoap
  // URL       : http://localhost:3677/WebService/AuthService.asmx
  // ************************************************************************ //
  AuthServiceSoap = interface(IInvokable)
  ['{616637E9-8425-B3E1-37E4-3FBBB1901351}']
    function  GetAuthorizationTicket(const inParam: Integer): WideString; stdcall;
  end;

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


implementation

function GetAuthServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): AuthServiceSoap;
const
  defWSDL = 'http://localhost:3677/WebService/AuthService.asmx?wsdl';
  defURL  = 'http://localhost:3677/WebService/AuthService.asmx';
  defSvc  = 'AuthService';
  defPrt  = 'AuthServiceSoap';
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 AuthServiceSoap);
    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(AuthServiceSoap), 'http://localhost:3677/webservice', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(AuthServiceSoap), 'http://localhost:3677/webservice/GetAuthorizationTicket');

end.

Меня смущает SOAP сообщение, которое отправляет дельфи при вызове метода.
Skiff
Дата: 20.10.2006 16:56:19
Журавлев Денис
Skiff
Но курс то я получаю! Поэтому и говорю, что чего то в сервисе моем не достаточно. Или типы использую я не те. Вот в этом то и состоит проблема.

Или я не о том?
Прошу прощения прочитал по диагонали, поэтому не понял.
Хочется увидеть код (описание вебфункции) сервиса на c#. И код обертки сгенеренной делфи.


Если у вас, достанет терпения, я могу сбросить вам исходники сервиса и двух клиентов - на дельфи и на C#.
Skiff
Дата: 20.10.2006 17:00:48
вот так я вызываю свой метод
procedure TForm4.Button3Click(Sender: TObject);
var
   AuthService : AuthServiceSoap;
   res: string;
begin
  AuthService := GetAuthServiceSoap(false, '', HTTPRIO1);
  res := AuthService.GetAuthorizationTicket(11111);
  ShowMessage(res);
end;
о именах экземпляров классов особо не думал, вопрос в другом состоит :)
экземпляр HTTPRIO1 передаю для того, чтобы перехватить отправляемое сообщение. Вызов вида
  AuthService := GetAuthServiceSoap();
ни каких изменений не приносит.

А вот мой вызов метода сервиса центробанка
procedure TForm4.Button1Click(Sender: TObject);
var
  Daily: DailyInfoSoap;
begin
  //Получили интерфейс
  Daily := GetDailyInfoSoap();
  //Вызвали метод получения курса за дату, дату получаем тож с сервера
  
  ShowMessage(Daily.GetCursOnDateXML(Daily.GetLatestDateTime));
end;
Журавлев Денис
Дата: 20.10.2006 18:46:57
Мда, прямо подземный стук какой-то.
Рассказывай остальное, в чем запускаешь севис, в isa или в делфевом вебсервере, версия делфи?
Честно говоря не встречал такой проблемы, единственно что я делаю HTTPRIO.HTTPWebNode.UseUTF8InHeader := True;
Skiff
Дата: 20.10.2006 19:08:29
Журавлев Денис
Мда, прямо подземный стук какой-то.
Рассказывай остальное, в чем запускаешь севис, в isa или в делфевом вебсервере, версия делфи?
Честно говоря не встречал такой проблемы, единственно что я делаю HTTPRIO.HTTPWebNode.UseUTF8InHeader := True;


Сервис запускаю как в родномокружении, то бишь в IIS, так и под отладкой VS2005.

вебсервис то не дельфёвый.
вот в том то и дело - стук...