从WSDL生成的WCF代理,代理方法返回null

时间:2009-12-05 17:12:45

标签: c# wcf wsdl

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

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

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

是否有其他人遇到类似的问题,相应的解决方案是什么?最可能的问题来源是什么?

重新编辑:

这是一个RPC /编码的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节:

  

如果使用编码,则每个消息部分使用类型属性引用抽象类型。

但是后来我有点困惑,因为在question中它似乎不是一个问题。进行类似更改需要做什么,并限制它是RPC /编码服务?

2 个答案:

答案 0 :(得分:2)

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

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

请发布包含您遇到问题的其中一条消息的WSDL片段。然后,当您将消息的定义与您在线路上看到的内容进行比较,然后将其与要使用消息的代理类的详细信息进行比较时,我相信您会明白我的意思。代理类期望一个名称空间,但在线上,正在使用不同的名称空间。

答案 1 :(得分:0)

在针对来自Java Web服务的WSDL使用WCF客户端时,我们已经有了类似的东西。

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

然而,当我们查看电线上的内容时,数据就在那里。

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

解决方案是将对象转换为我们预期的类型,然后显示所有字段。