【发布时间】:2010-11-11 12:56:00
【问题描述】:
我已经导入了一个 WSDL 并使用它来发送一个 SOAP 请求。它看起来像这样:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<Calculate xmlns="urn:xx.WSDL.xxxxxWebService">
<ContractdocumentIn>
<AL>
...More XML...
问题在于Calculate 元素中的xmlns="urn:xx.WSDL.xxxxxWebService" 部分。 Web 服务无法接受这一点。 Web 服务不喜欢这样的命名空间......
使用SoapUI 我发现这个请求可以正常工作:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:col="http://example.com.service.xxx/">
<SOAP-ENV:Body>
<col:Calculate>
<ContractdocumentIn>
<AL>
...More XML...
那么,如何将请求从第一个版本更改为第二个版本? (不使用肮脏的技巧!)
(如果这会导致正确的请求格式,则重新导入不是问题。)
再次重申:不允许使用肮脏的伎俩,例如破解请求流来修改它!
虽然我还没有完全测试它,但 C#/VS2010 和 Delphi 2010 似乎也无法使用我试图调用的 Web 服务。似乎是用 Java 编写的 Web 服务。 SoapUI 恰好是用 Java 编写的,因此我们有一个 Java 客户端与一个 Java 服务通信,这似乎工作得很好。但是还有其他客户吗?
无论如何,是时候再添加两个标签了:“Java”,因为它是 Java 服务,以及“vs2010”,因为 .NET 也不喜欢这个服务。
我正准备在 .NET 中围绕这个服务编写一个包装器,希望那会工作......它不会。所以这是一个非常严重的缺陷,可能是Java缺陷……
【问题讨论】:
-
祝你好运。我不得不诉诸肮脏的伎俩。
-
是的,我知道。我可能可以通过使用肮脏的技巧来解决它,但管理层不同意这一点。所以代码需要干净。
-
SOAP 代码为您提供了钩子来检查正在发送的 XML,并在需要时对其进行修改。它显式地支持手动操作。并且代码将在那里 - 关于构建后操作没有什么“肮脏”的。可能不如自动的好,但没有人应该担心它。
-
我知道。甚至不会太难。捕获 BeforeExecute 事件,读取 XML,使用样式表对其进行转换,然后使用新的 XML 重新创建流。这就是我向管理层提出的建议。他们确信这太复杂了,现在我需要找到其他解决方案。如果没有,他们将不得不接受这一点,尽管......
-
如果没有好的答案出现,我会筹码获得赏金。
标签: java delphi visual-studio-2010 soap delphi-2007