有人可以说明一下这种行为吗?看起来Delphi SOAP将函数结果设置为最后一个参数,但是WSDL.exe读取了第一个参数作为函数结果。

我在Delphi SOAP服务中具有以下方法,其中结果字符串用于基本错误处理:

function LoadCustomer(CustomerID: Double; out CustomerName: String): String;

生成的WSDL如下所示:
<message name="LoadCustomer2Request">
  <part name="CustomerID" type="xs:double"/>
</message>
<message name="LoadCustomer2Response">
  <part name="CustomerName" type="xs:string"/>
  <part name="return" type="xs:string"/>
</message>

出于某种原因,WSDL.exe生成下面的C#代码,该代码交换CustomerName和'Result'字符串:
public string LoadCustomer(double CustomerID, out string @return) {
        WindowsFormsApplication1.ServiceReference1.LoadCustomerRequest inValue = new WindowsFormsApplication1.ServiceReference1.LoadCustomerRequest();
        inValue.CustomerID = CustomerID;
        WindowsFormsApplication1.ServiceReference1.LoadCustomerResponse retVal = ((WindowsFormsApplication1.ServiceReference1.ISKiWebInterface)(this)).LoadCustomer(inValue);
        @return = retVal.@return;
        return retVal.CustomerName;
    }

最佳答案

当SOAP主要是面向rpc的问题时,经常会出现这些问题。没有确定哪个部分是函数(操作)结果的特定顺序。 Delphi自己的进口商过去曾[可能仍会这样做?]通过零件名称识别“结果”。您可以(可以??)指定以逗号分隔的名称列表。如果没有一个部分与名称匹配,那么如果有一个单独的名称,则为结果。

SOAP规范。最终包括解决该问题的附加功能。在您的情况下,相关的是'parameterOrder'属性(实际的SOAP数据也有rpc:result)。但是,您几乎看不到使用该属性的WSDL。但是,我相信WSDL.EXE确实注意该属性。您可以在此处找到有关parameterOrder的更多信息:

http://www.w3.org/TR/wsdl#_parameter

我建议您做的是将Delphi生成的WSDL保存到文件中。并更新后面的内容以包含parameterOrder属性(*)。例如,在您提供的情况下,您将要查找映射到该接口(interface)的portType并按如下所示更新操作:

  <portType name="InterfaceName">
    <operation name="LoadCustomer" parameterOrder="CustomerId, CustomerName">
      <input message="tns:LoadCustomer2Request"/>
      <output message="tns:LoadCustomer2Response"/>
    </operation>
  </portType>

然后,使用WSDL.EXE导入更新的WSDL应该会为您带来以下好处:
  public string LoadCustomer(out string CustomerName, double CustomerID) {
    object[] results = this.Invoke("LoadCustomer", new object[] {
                CustomerID});
    CustomerName = ((string)(results[1]));
    return ((string)(results[0]));
  }

您还应该在方法上方看到以下属性,以确认“返回”确实是结果:
 [return: System.Xml.Serialization.SoapElementAttribute("return")]

我建议打开一个QC,要求由Delphi的WSDL逻辑生成parameterOrder。

干杯,

布鲁诺

PS:(*)更新WSDL生成逻辑以发出parameterOrder也很容易。自从我进入该代码以来,这已经是很漫长的时间了,但是这很简单(如果我没记错的话:)

关于.net - SOAP不一致? Delphi 2010(Win32)Server和.NET Client交换 'out-parameter'和 'result',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1999167/

10-12 00:12
查看更多