DelphiSOAPEnvelope和WCF我正在开发一个提供soap接口的系统。将使用该接口的系统之一是在Delphi7中编码的。Web服务是使用WCF、基本的http绑定、SOAP1.1开发的。如果我使用SOAPUI(JAVA),该服务工作正常。但是Delphi似乎在这里做了一些特别的事情;)这是消息在SOAPUI中的样子:我不是delphi开发人员,但我开发了一个简单的测试客户端来查看问题所在。这就是Delphi作为SOAP信封发送的内容。253WCF抛出德语错误...;)EswurdedasEndelement“Body”ausnamespace“http://schemas.xmlsoap.org/soap/envelope/”erwartet。Gefundenwurde“Element”NS2:GetCustomerRequest“ausNamespace”http://services.xxx.de/xxx“”。Zeile1,位置599。表示预期的身体。但是找到了元素“NS2:GetCustomerReques”。现在我的问题是:我能以某种方式改变Delphi创建信封的方式吗?或者有没有办法让WCF使用这种消息格式?任何帮助是极大的赞赏!与此处某些人似乎暗示的相反,Delphi不发送无效的SOAP,它只发送RPC/编码的SOAP。从所有xsi:type属性中很容易识别它。RPC/Encoded不符合WS-I,但它仍然是有效的SOAP。默认情况下,WCF使用Document/Literal/WrappedSOAP格式,Delphi7在服务器端根本无法处理,您必须在客户端进行一些调整。最简单的解决方案是简单地告诉Delphi使用Document/Literal样式。您可以通过在THttpRio.Converter.Options的soLiteralParams中启用soLiteralParams来做到这一点。这告诉Delphi不要像您看到的那样“展开”参数。“文档”方面是DelphiWSDL导入器通常会处理的事情,因此您不必担心。另一种解决方案是告诉WCF服务使用RPC/编码样式,您可以通过向服务添加以下属性来实现:[ServiceContract][XmlSerializerFormat(Style=OperationFormatStyle.Rpc,Use=OperationFormatUse.Encoded)]publicinterfaceIMyService{//etc.}第二个已弃用,因为正如我之前提到的,RPC/Encoded不符合WS-I,但大多数SOAP工具包都能识别它,因此我将其列为一种可能性。我只是做了其中一个,最后我做了一系列stringreplace调用来改变我的XML输出以去除内联名称空间并使其看起来像SoapUI的格式。是的,需要大量的手动黑客才能做到这一点。例如:创建RIO后,调用自己的BeforeExecuteproc:...EEUPSERTRIO.OnBeforeExecute:=self.RIO_BeforeExecute;...程序TMyWrapper.RIO_BeforeExecute(constMethodName:string;varSOAPRequest:WideString);{由于Delphi不太擅长SOAP,我们需要修复请求以使名称空间正确。基本上,您可以使用Delphi提供的内容并在SoapUI中进行尝试。如果您的版本不起作用而SoapUI的版本可以,请让您的看起来像他们的。}...现在删除内联命名空间:SOAPRequest:=StringReplace(SOAPRequest,'xmlns:NS1="http://services.xxx.de/xxx"','',[rfReplaceAll,rfIgnoreCase]);......很多这样的。然后,您可以将soap标头替换为包含所需命名空间的标头。SOAPRequest:=StringReplace(SOAPRequest,'xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns:ns1="http://services.xyzcorp.com/xyz/EnterpriseEmployeeService_1_0"'+'xmlns:ns1="http://schemas.xyzcorp.com/TLOIntegration_HRO_Preview/TLOIntegration_1_0"',[]);那么你好的可以重新注入:ReplaceTag(SOAPRequest,'','ns1:');ReplaceTag(SOAPRequest,'','ns1:');ReplaceTag(SOAPRequest,'','ns1:');最后,您可以通过使用SoapUI来重新使用WSDL并让它托管模拟服务以轻松捕获您的Delphi输出。然后将您的应用程序指向它作为端点,它将捕获输出。或者,您可以使用Fiddler作为代理来捕获请求。Delphi和Java框架使用不同的命名空间。如果兼容的一种方法是拦截原始xml并将所有“NS2”更改为反序列化器期望的任何内容并且我需要了解更多有关C#学习教程的信息,希望大家多多关注-本文收集自网络且不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
