【问题标题】:WCF proxy generated from WSDL, proxy method returns null从 WSDL 生成的 WCF 代理,代理方法返回 null
【发布时间】:2009-12-05 17:12:44
【问题描述】:

我已经从 WSDL 文件生成了 WCF 代理,但是现在当我调用代理方法时,它们返回 null。我启用了消息记录,并且可以看到来自服务器的消息已正确返回。

我已经检查了this 问题的答案,但在我的情况下,至少返回对象的名称在消息和 WSDL 中是相同的。我仍然认为问题与 WSDL 文件有关,因为它不是通过“?wsdl” URL(它是第 3 方网络服务)以通常的方式获取的,而是单独给出的。

方法的返回类型只是一个字符串。

有没有其他人遇到过类似的问题,如果有的话,相应的解决方案是什么?问题的最可能根源是什么?

重新编辑:

它是一个 RPC/Encoded Web 服务。正如所写,我可以通过消息记录看到 SOAP 响应,但 WCF 似乎无法解析信息。

服务响应的消息部分如下所示:

<ns1:ServiceResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="the target namespace">
    <ns1:ReturnValue xsi:type="xsd:string">

但是,当检查来自我的客户的传出消息时,情况有所不同:

<ns1:ServiceRequest soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="the target namespace">
    <RequestValue xsi:type="xsd:string" xmlns="">

所以也许代理期望响应具有相同的命名空间结构,因此无法解析它。

我尝试将 wsdl 消息定义中的 type 属性更改为 element,并在 wsdl 定义的 types 部分添加了一些新元素,但随后 svcutil 在生成代理时阻塞,抱怨推断的样式文档和指定的样式 rpc 之间存在冲突。

来自WSDL specification,第 3.5 节:

如果使用是encoded,则每个消息部分都使用type属性引用一个抽象类型。

但是我有点困惑,因为在这个question 中似乎没有问题。在限制为 RPC/编码服务的情况下进行类似更改需要什么?

【问题讨论】:

  • 您是如何生成 WSDL 的?您是使用 svcutil 命令还是在 VSS 中添加服务?而且,您知道响应的格式(文本、MTOM?)以及它是什么类型的网络服务?
  • 正确:您是如何从 WSDL 生成类的?

标签: c# wcf wsdl


【解决方案1】:

您必须提供有关 Java 服务的详细信息才能解决此问题。但是,我怀疑 Java 服务正在使用使用 type 属性定义的消息部分。这些不符合 WS-I Basic Profile 1,因为对于应该为消息的元素使用哪个名称空间存在歧义。一些服务将使用该类型的命名空间,而其他服务将(正确)使用 Web 服务本身的命名空间。

使用element 属性可以消除歧义,因此是首选。

请发布 WSDL 的 sn-p,其中包含您遇到问题的消息之一。然后,当您将消息的定义与您在网络上看到的内容进行比较,然后将其与旨在使用该消息的代理类的详细信息进行比较时,我相信您会明白我的意思。代理类需要一个命名空间,但在网络上,正在使用不同的命名空间。

【讨论】:

  • 是的,就是这样,wsdl部分是用type属性定义的。我会尽可能地尝试这个,然后我也会举个例子。
  • 我尝试添加一个元素,但随后我收到警告“从操作服务中的消息推断的样式文档与通过绑定指定的预期样式 Rpc 不匹配。”所以我怀疑我没有在正确的地方添加元素。现在我将它添加为 在 wsdl:types > 模式下。它在消息中被引用为 element="tns:ReturnValue"。
【解决方案2】:

我们在使用 WCF 客户端处理来自 Java Web 服务的 WSDL 时遇到了类似的情况。

我们的问题是我们看不到从服务返回的数据,看起来数据丢失了。

但是,当我们查看通过网络传输的内容时,数据就在那里。

问题在于 WSDL 有许多继承自其他类型的类型。默认情况下,我们只会看到基本类型中的信息。

解决方案是将对象转换为我们期望的类型,然后所有字段都出现了。

【讨论】:

  • 是的,这就是我正在寻找的答案。然而,在这种情况下并非如此,因为我正在处理一个基本类型,所以整个对象(字符串)为空,而不仅仅是它的一部分。
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2023-03-04
  • 2010-12-20
相关资源
最近更新 更多