Delphi XE неправильно использует веб-сервис - PullRequest
1 голос
/ 26 января 2012

Имея WSDL-шоу ниже Delphi XE создает код, показанный здесь.Наш WebService работает на сервере BizTalk:

....
....

  PicassoBTSTest_PortalOrchestration_Port_Portal = interface(IInvokable)
  ['{706CEB1F-0EC1-08C2-03C7-395C12905558}']
    **procedure Operation_Portal(var part: Variant); stdcall;**
  end;

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

....
....

При вызове WebService я делаю, как показано здесь:

procedure TForm1.Button2Click(Sender: TObject);
var
  X: PicassoBTSTest_PortalOrchestration_Port_Portal;
  V: Variant;
begin
  X := GetPicassoBTSTest_PortalOrchestration_Port_Portal;

  V := 'JUST A TEST';

  X.Operation_Portal(V);
  ShowMessage(V);
end;

Как мы видим в наших журналах, этот код вызываетнаш бэкэнд правильный.Но мы не получаем правильный ответ обратно.Параметр V не изменяется после вызова Operation_Portal.Он содержит текст «ПРОСТО ТЕСТ», когда он должен содержать другие значения.

Я попытался запустить код из Delphi 2006, и он дает мне тот же результат.

Что яделать неправильно.Почему я не получаю ответ от нашего бэкэнда?

/ Брайан

<?xml version="1.0" encoding="UTF-8"?>
-<wsdl:definitions xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:tns="http://techotel.dk/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://techotel.dk/" name="BizTalkServiceInstance">-<wsdl:documentation><CreationInfo Created="2012-01-26 10:31:43Z"/></wsdl:documentation>-<wsdl:types><xsd:schema targetNamespace="http://techotel.dk/Imports"/></wsdl:types>-<wsdl:message name="PicassoBTSTest_PortalOrchestration_Port_Portal_Operation_Portal_InputMessage"><wsdl:part name="part" type="xsd:anyType"/></wsdl:message>-<wsdl:message name="PicassoBTSTest_PortalOrchestration_Port_Portal_Operation_Portal_OutputMessage"><wsdl:part name="part" type="xsd:anyType"/></wsdl:message>-<wsdl:portType name="PicassoBTSTest_PortalOrchestration_Port_Portal"><wsdl:documentation>service "PicassoBTSTest.PortalOrchestration" port "Port_Portal"</wsdl:documentation>-<wsdl:operation name="Operation_Portal"><wsdl:documentation>operation "Operation_Portal"</wsdl:documentation><wsdl:input message="tns:PicassoBTSTest_PortalOrchestration_Port_Portal_Operation_Portal_InputMessage"/><wsdl:output message="tns:PicassoBTSTest_PortalOrchestration_Port_Portal_Operation_Portal_OutputMessage"/></wsdl:operation></wsdl:portType>-<wsdl:binding name="BasicHttpBinding_ITwoWayAsync" type="tns:PicassoBTSTest_PortalOrchestration_Port_Portal"><soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>-<wsdl:operation name="Operation_Portal"><wsdl:documentation>operation "Operation_Portal"</wsdl:documentation><soap:operation style="document" soapAction="Operation_Portal"/>-<wsdl:input><soap:body use="literal"/></wsdl:input>-<wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding>-<wsdl:service name="BizTalkServiceInstance">-<wsdl:port name="BasicHttpBinding_ITwoWayAsync" binding="tns:BasicHttpBinding_ITwoWayAsync"><soap:address location="http://akibiztalk01.internal.local/PicassoBTSTestPortal/PicassoBTSTest_PortalOrchestration_Port_Portal.svc"/></wsdl:port></wsdl:service></wsdl:definitions>

1 Ответ

0 голосов
/ 26 января 2012

Сначала я должен убедиться, что сервер отправляет ответ XML SOAP, который содержит ожидаемое значение.

Если значение находится в ответе, то Delphi каким-то образом не может присвоить его переменной Variant.

Сервис был разработан на C #? Возможно, для тестов полезно написать Delphi-версию сервиса и сравнить XML-структуру ответа.

...