【问题标题】:Semi-custom WCF proxy returns zeros, despite valid data coming back on wire尽管有效数据通过线路返回,但半自定义 WCF 代理仍返回零
【发布时间】:2011-06-17 03:59:47
【问题描述】:

我希望调用一系列 SOAP 服务(跨越一系列服务),虽然端点定义和记录良好,但没有 WSDL 数据......所以我决定构建自己的。 为此,我构建了一个测试 WCF 服务,该服务与我希望调用的服务的已知接口相匹配。

然后我保存了它公开的 WSDL,更改了 WSDL 引用的基地址,创建了我的代理(使用 wsdl.exe),将其添加到测试客户端项目中,并且可以成功创建代理并进行调用,从而导致 SOAP服务发送预期的响应...只有这个预期的响应没有被代理接收并返回给调用代码。

查看来回流量时...我可以清楚地看到服务正在回复我想要的内容。

关于如何解决此问题并让代理获取数据的任何建议?

鉴于回复实际上是相同的,我不得不回顾一下我的客户发送的内容和另一个发送的内容之间的差异。

一个已知的工作应用程序发送它的 XML blob,开头如下:

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

虽然我的客户立即从信封开始(没有 xml 标签,并且少了一个命名空间):

&lt;s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"&gt;

另一个区别是正文中的消息以他们的命名空间为前缀,而我的则不是……尽管两者都在标签中定义了这个命名空间。

阿拉:

<s:Body>
    <u:DoSomething xmlns:u="urn:http://some.namespace.org" />
</s:Body>

对比:

<s:Body>
    <DoSomething xmlns="urn:http://some.namespace.org" />
</s:Body>

【问题讨论】:

    标签: c# wcf wsdl


    【解决方案1】:

    这不是命名空间:

    s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    

    它正在设置信封的编码样式,即使per the SOAP spec 不需要它,可能您正在与之交谈的特定实现也需要它。您是否对从客户端发送的内容有足够的控制权以将其放在那里?

    除此之外,XML PI 不是必需的,我认为您在查看正文 XML 时肯定走在正确的轨道上。这几乎总是在某处出现某种命名空间不匹配的情况。您是否 100% 肯定命名空间 URI 是相同的

    【讨论】:

    • 唉,我对 WCF 的经验很少,所以不知道将 encodingStyle 注入到请求中需要多少控制,甚至将其记录为生成的 WSDL 文件的一部分。至于正文中的 URI……是的,这些 URI 是相同的。它们之间的唯一区别是一个有/使用前缀(即'xmlns:u =',而我的没有那么前缀(即'xmlns =')。
    【解决方案2】:

    最可能的问题是使用“默认”XML 命名空间的 VS 版本。我使用过的一些肥皂解析器在使用非别名(默认)命名空间时无法正常工作。如果您知道使用 u: 别名与服务一起使用,那么即使 s:Body 元素中的每个标签都以别名为前缀,您的代理也应该生成它。

    【讨论】:

    • 如何/在哪里(做)一个人这样做? WSDL & 代理已经有一个与之关联的命名空间,以匹配服务器的期望。
    • 不幸的是,在 WCF 中塑造肥皂结构会变得非常棘手,但这是可能的。它当然是一个高级主题,需要了解 WCF 如何创建消息。这个MSDN article on MessageContract 包含您开始使用所需的所有信息。如果您是 WCF 新手,我会先从 O'Reilly 出版商的一本书开始,以便在使用 MessageContract 之前了解 WCF 的基础知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多