SOAP不一致? Delphi 2010(Win32)服务器和.NET客户端交换’out-p
有人可以对这种行为有所了解吗?看起来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’属性(还有rpc:实际SOAP数据的结果).但是,您几乎看不到使用该属性的WSDL.但是,我相信WSDL.EXE确实关注该属性.您可以在此处找到有关parameterOrder的更多信息: http://www.w3.org/TR/wsdl#_parameter 我建议你做的是将Delphi生成的WSDL保存到文件中;并更新后者以包含parameterOrder属性(*).例如,在您提供的情况下,您将需要找到映射到接口的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’确实是结果: [return: System.Xml.Serialization.SoapElementAttribute("return")] 我建议打开一个QC,请求通过Delphi的WSDL逻辑生成parameterOrder. 干杯, 布诺 PS:(*)更新WSDL生成逻辑以发出parameterOrder也很容易.自从我进入该代码以来,这是一个漫长的时间,但它是相当直接的(如果我没记错的话:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |