Delphi WSDL возвращает ноль

#c# #xml #web-services #delphi #wsdl

#c# #xml #веб-сервисы #delphi #wsdl

Вопрос:

Я новичок в работе со службой WSDL, и я столкнулся с проблемой в ответе, полученном от службы, и технические детали:

1- Сервис построен с использованием C # и описания из файла .pas :

   // Namespace : http://tempuri.org/
  // soapAction: http://tempuri.org/IService/%operationName%
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // use       : literal
  // binding   : BasicHttpBinding_IService
  // service   : Service
  // port      : BasicHttpBinding_IService
  // URL       : http://website.com/WCF/ServiceRegistryWCF.Service.svc

IService= interface(IInvokable)
  

2- описание основного объекта из файла .pas :

   // XML       : InOut, global, <complexType>
  // Namespace : http://schemas.datacontract.org/2004/07/MySDK.Accomodation
  InOut2 = class(IBusinessObject2)
  

3- Я вызываю службу следующим образом:

 var
  Form1: TForm1;
  HRIO: THTTPRIO;
procedure MyProcedure();
var
  ioObj: InOut2;
  res: string;
begin
  HRIO := THTTPRIO.Create(nil);
  HRIO.OnAfterExecute := THRIOActions.HTTPRIO1AfterExecute;
  HRIO.OnBeforeExecute := THRIOActions.HTTPRIO1BeforeExecute;
  HRIO.WSDLLocation := 'http://website.com/WCF/ServiceRegistryWCF.Service.svc?wsdl';
  HRIO.Service := 'Service';
  HRIO.Port := 'BasicHttpBinding_IService';
  HRIO.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts, soAutoCheckAccessPointViaUDDI];
  HRIO.Converter.Options := HRIO.Converter.Options   [soDocument, soLiteralParams];
  HRIO.Converter.Encoding := 'utf-8';

  ioObj := InOut2.Create;
  ioObj.UserName := '1234567890';
  ioObj.Password := '123456';
  ioObj.InOutID := 123456789;

  res := (HRIO as IService).ProcedureName('password', ioObj, 0);
  memo1.lines.add(res);
end;
  

Когда я отслеживал процесс с помощью двух процедур («HTTPRIO1AfterExecute», «HTTPRIO1BeforeExecute») Я нашел результат следующим образом:

Текст запроса:

 <?xml version="1.0" encoding="utf-8"?>
    <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">
    <SOAP-ENV:Body>
        <ProcedureName xmlns="http://tempuri.org/">
            <LocalPassword>password</LocalPassword>
            <io>
                <InOutID xmlns="http://schemas.datacontract.org/2004/07/MySDK.Accomodation">
                    123456789
                </InOutID>
                <Password xmlns="http://schemas.datacontract.org/2004/07/MySDK.Accomodation">
                    123456
                </Password>
                <UserName xmlns="http://schemas.datacontract.org/2004/07/MySDK.Accomodation">
                    1234567890
                </UserName>
            </io>
            <language>0</language>
        </ProcedureName>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  

Текст ответа:

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <ProcedureNameResponse xmlns="http://tempuri.org/">
            <ProcedureNameResult i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
        </ProcedureNameResponse>
    </s:Body>
</s:Envelope>
  

И конечный результат был:

 <ProcedureNameResult xmlns="http://tempuri.org/" i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
  

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

Прошу прощения за продление, но я попытался объяснить все возможные детали.

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

1. Вы не получаете никаких ошибок. Ваш запрос является запросом, и данные с параметром поиска не найдены. Мы не сможем помочь. Я бы сначала попробовал запрос, чтобы получить все идентификаторы в базе данных. Затем убедитесь, что запрашиваемый вами идентификатор действительно находится в базе данных.

2. Спасибо за ваш ответ, я знаю, что я не получаю никакой ошибки, но результат, который я получаю, является ошибкой, как я упоминал ранее, результатом должен быть один из двух вариантов (True / ErrorMessage), и даже если идентификаторы отсутствуют в базе данных, служба вернет сообщение, указывающее на это.

3. Что я пытаюсь проверить, верны ли настройки на шаге No3, или я что-то пропустил.

4. Если InOutID отсутствует на компьютере, вы получите именно те результаты, которые получаете. Итак, код хорош, но параметры запроса (имя пользователя, пароль, идентификатор) не соответствуют никаким данным.

5. Я бы попробовал использовать что-то вроде PostMan и посмотрел, какой ответ вы получите, используя значения из вашего запроса. Это, по крайней мере, подтвердит, что ваш запрос настроен правильно. У меня нет никакой связи с PostMan, кроме того, что я нахожу его полезным инструментом.