有人可以说明一下这种行为吗?看起来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/