编写C#客户端以使用返回对象数组的Java Web服务

时间:2020-03-05 18:54:01  来源:igfitidea点击:

我正在编写一个Cclient,它调用用Java(由另一个人)编写的Web服务。我已将Web参考添加到我的客户端,并且可以在Web服务中调用方法了。

服务已更改为返回对象数组,并且客户端未正确解析返回的SOAP消息。

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}

当我生成的Cproxy调用Web服务(使用SoapHttpClientProtocol.Invoke)时,我期望MyResponse []数组的长度为1,即单个元素。无论服务实际返回了什么,在调用调用之后我得到的都是id = 0和reason = null的元素。使用数据包嗅探器,我可以看到该服务返回的似乎是合法的肥皂消息,其id和reason设置为非null值。

是否有一些技巧可以使Cclient调用返回someobject []的Java Web服务?如有必要,我将继续进行消毒的演示。

编辑:这是通过"添加网络参考..."的网络参考。 VS 2005,.NET 3.0。

解决方案

回答

已经有一段时间了,但是我似乎记得在.Net和Java Web服务之间处理默认名称空间的方式略有差异时遇到麻烦。

再次检查生成的cproxy类和其中声明的任何名称空间(尤其是默认值xmlns =""),以与Java服务所期望的名称保持一致。我们可能必须重新创建非常细微的差异。

如果是这种情况,那么我们将在目录中提供更多的名称空间声明。

回答

从问题来看,似乎客户端在某一时刻工作,然后更改了服务以返回一个数组。确保重新生成代理,以便在客户端上反序列化返回的SOAP消息。尚不清楚我们只是确定要这样做。

回答

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

该服务的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中指定响应元素。每当我们更新引用时,都必须重做此操作,但至少它可以工作。