gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:11 27 4
gpt4 key购买 nike

我正在编写一个 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 设置为非空值。

是否有一些技巧可以让 C# 客户端调用返回 someobject[] 的 Java Web 服务?如有必要,我将努力获得经过净化的演示。

编辑:这是通过“添加网络引用...”进行的网络引用。 VS 2005,.NET 3.0。

最佳答案

感谢 Xian,我有了解决方案。

服务的 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 中指定的元素。每当您更新引用时,您都必须重做此操作,但至少它有效。

关于c# - 编写 C# 客户端以使用返回对象数组的 Java Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com