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

Dav*_*lle 10 c# java web-services

我正在编写一个C#客户端,它调用用Java编写的Web服务(由另一个人编写).我已经向我的客户端添加了一个Web引用,我可以在Web服务中调用方法.

服务已更改为返回对象数组,客户端无法正确解析返回的SOAP消息.

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}
Run Code Online (Sandbox Code Playgroud)

当我生成的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.

Dav*_*lle 8

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

服务的wsdl包含一行

<import namespace="http://mynamespace.company.com"/>
Run Code Online (Sandbox Code Playgroud)

客户端发送到服务器的soap在所有数据元素上具有以下属性:

xmlns="http://mynamespace.company.com"
Run Code Online (Sandbox Code Playgroud)

但响应(从服务返回给客户端)的XML负载并没有这个命名空间包含在内.通过修改HTTP响应(我使用WireShark获得),我发现如果我在每个返回的数据元素上强制使用xmlns属性,那么.NET代理类正确地选择了MyResponse值.

如果没有更改我无法控制的服务,解决方法是编辑VS生成的代理类(例如Reference.cs)并查找如下所示的行:

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

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


Xia*_*ian 3

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

根据 Java 服务的期望,仔细检查生成的 C# 代理类和其中声明的任何命名空间(尤其是默认值 xmlns="")。可能会有非常细微的差异,您必须重新创建这些差异。

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