Web服务返回具有空字段的对象

4

我以前从来没有见过这个。

WebService.Implementation imp = new WebService.Implementation();
WebService.ImplementationRequest req = new WebService.ImplementationRequest();
return imp.GetValue(req);

imp返回的对象不是空的,它返回了一个ImplementationResponse,这是预期的。但是该对象中的所有字段都为空,这是不符合预期的。目前WebService只返回一些常量虚拟数据。我们已在另一台开发人员的计算机上进行了测试,结果完全正常。
我想我也应该指出,如果我将null传递给GetValue方法,WebService应该抛出异常。但对于我来说并没有抛出异常。
你有什么想法,我的环境可能出了什么问题,导致WebService返回一个对象,但该对象中的每个值都为空?还有,为什么它应该抛出异常时,却“神奇地”返回这个神秘的对象呢?
3个回答

9
通常情况下,这种情况发生在生成的代码与Web服务返回的XML之间存在差异,因此无法进行反序列化。

重新获取wsdl,重新生成所有代理类,然后重试。确保您发送了正确的虚拟数据。

更新:

这种情况经常发生在我们的团队没有管理Web服务并且我们得不到有关服务更改的任何通知时。最终,我们拦截了Web服务管道中的SOAP消息以进行调试。此处提供了一个很好的资源,可以帮助您入门。

您不需要更改管道中的任何内容,只需获取SOAP消息并保存它们以便以后进行调试即可。大多数情况下,问题就是合同中的更改。其他情况下,我们没有合同,因此没有办法在未捕获信封的情况下知道更改。

无论如何,即使这不是您的问题,我认为拥有这个工具也是一件好事。


我以为这可能就是答案,我试了一下你的建议。但没有成功。 - Xaiter

3

带有 < DataMember() > 属性标记的字段,否则它们将不会被序列化?

<DataMember()> _
Public Property SomeField() As String
    Get
        Return m_strSomeField
    End Get
    Private Set(ByVal value As String)
        m_strSomeField= value
    End Set
End Property

此外,考虑使用跟踪查看器来分析客户端和服务器之间发送的消息。有关信息,请参见:

https://dev59.com/ZkbRa4cB1Zd3GeqP15oy


值得一提的是,使用WCF日志查看器查看跟踪信息,这里有一个奇怪的事情,它在日志中没有显示出来。甚至没有错误,就好像它根本没有尝试发出请求一样。 - Xaiter
哦,是的,还确保将东西标记为DataMember。它已经标记了。 - Xaiter

0
我想我也应该注意一下,如果我将null传递给GetValue方法,WebService应该抛出异常。
你没有传递null,在这里你传递了一个请求对象。
此外,您需要能够调试Web服务以查看发生了什么。我假设您正在内部实现此功能,因为您可以将其设置为常量虚拟值。

我知道在示例代码中传递了一个值。我的意思是,如果我将null传递到该方法中。 - Xaiter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接