【问题标题】:Writing C# client to consume a Java web service that returns array of objects编写 C# 客户端以使用返回对象数组的 Java Web 服务
【发布时间】:2010-09-09 01:17:36
【问题描述】:

我正在编写一个 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 的元素,无论服务实际返回什么。使用数据包嗅探器,我可以看到该服务正在返回看似合法的肥皂消息,其 id 和原因设置为非空值。

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

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

【问题讨论】:

  • 您使用的是“添加 Web 引用”(.NET 2.0) 还是“添加服务引用”(.NET 3.0)?

标签: c# java web-services


【解决方案1】:

多亏了Xian,我有办法了。

服务的 wsdl 包含一行

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

客户端发送到服务器的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 中指定的名称空间中查找响应元素。每当您更新参考时,您都必须重新执行此操作,但至少它可以工作。

【讨论】:

  • 感谢您发布您的解决方案,它带回了很多回忆!
【解决方案2】:

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

根据 Java 服务的预期,仔细检查生成的 c# 代理类和其中声明的任何命名空间(尤其是默认的 xmlns="")。您可能需要重新创建非常细微的差异。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你的理解是正确的。在我添加返回 MyResponse[] 的方法之前,它确实有效。我刷新了引用并重建了代理。
    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2010-09-17
    相关资源
    最近更新 更多