2008-09-15 102 views
10

我正在编写一个C#客户端,它调用由Java(由另一个人)编写的Web服务。我已经为我的客户添加了一个Web引用,并且我可以在Web服务中调用方法。编写C#客户端以使用返回对象数组的Java Web服务

服务被更改为返回一个对象数组,客户端没有正确解析返回的SOAP消息。

MyResponse[] MyFunc(string p) 

class MyResponse 
{ 
    long id; 
    string reason; 
} 

当我的生成的C#代理调用web服务(使用SoapHttpClientProtocol.Invoke),我期待具有1长度的MyResponse []数组,即一个单一的元件。无论服务实际返回什么,Invoke调用后的内容都是id = 0和reason = null的元素。使用数据包嗅探器,我可以看到服务正在返回看起来是合法的soap消息,id和理由设置为非空值。

是否有一些技巧让C#客户端调用返回someobject []的Java Web服务?如有必要,我将努力获得一个消毒过的演示。

编辑:这是通过“添加Web引用...”的Web引用。 VS 2005,.NET 3.0。

+0

您是使用“添加Web引用”(.NET 2.0)还是“添加服务引用”(.NET 3.0)? – 2008-09-15 17:19:43

回答

3

已经有一段时间了,但我似乎记得在.NET和Java Web服务之间处理默认命名空间的细微差别时遇到了麻烦。

根据Java服务的期望,仔细检查生成的c#代理类和任何名称空间(特别是缺省值xmlns =“”)中声明的名称空间。可能会有非常微妙的差异,您将不得不重新创建。

如果是这种情况,那么您将在c#属性中提供更多的名称空间声明。

0

从你的问题看,你有一个客户端工作,然后服务被更改为返回一个数组。确保您重新生成代理,以便在客户端上反序列化返回的SOAP消息。目前尚不清楚你是否做到了这一点 - 只是确保。

+0

你的理解是正确的。直到我添加了返回MyResponse []的方法后,它才开始工作。我刷新了参考资料,并且重建了代理。 – 2008-09-15 20:30:49

8

感谢西安,我有一个解决方案。

该服务的WSDL包括一个线

<import namespace="http://mynamespace.company.com"/> 

发送到服务器的客户端对所有数据元素的以下属性的皂:

xmlns="http://mynamespace.company.com" 

但是的XML有效载荷响应(从服务返回给客户端)没有有包括这个命名空间。通过修改HTTP响应(我通过WireShark获得),我观察到,如果我强制每个返回的数据元素都使用xmlns属性,则.NET代理类会正确地获取MyResponse值。

短期改变服务,这是我无法控制的,解决方法是编辑VS生成的代理类(如Reference.cs)和寻找这样的台词:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")] 
public partial class MyResponse { 

,并注释掉XmlType属性行。这将告诉CLR在默认命名空间中查找响应元素,而不是在wsdl中指定的响应元素。每次更新引用时都必须重做此操作,但至少可以工作。

+0

感谢您发布您的解决方案,它带回了大量的回忆! – Xian 2008-09-24 21:22:09