我正在编写一个C#客户端,它调用用Java编写的Web服务(由另一个人编写).我已经向我的客户端添加了一个Web引用,我可以在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和reason设置为非null值.
是否有一些技巧让C#客户端调用返回someobject []的Java Web服务?如有必要,我将努力获得一个消毒的演示.
编辑:这是通过"添加Web引用..."的Web引用.VS 2005,.NET 3.0.
感谢西安,我有一个解决方案.
服务的wsdl包含一行
客户端发送到服务器的soap在所有数据元素上具有以下属性:
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中指定的响应元素.每次更新引用时都必须重做这个,但至少它可以工作.