当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《编写C#客户端以使用返回对象数组的JavaWeb服务》经验,为你挑选了1个好方法。

我正在编写一个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.



1> David Chappe..:

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

服务的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中指定的响应元素.每次更新引用时都必须重做这个,但至少它可以工作.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有