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.
感谢西安,我有一个解决方案.
服务的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中指定的响应元素.每次更新引用时都必须重做这个,但至少它可以工作.
已经有一段时间了,但我似乎记得在 .Net 和 Java Web 服务之间处理默认命名空间的方式上存在细微差别时遇到了麻烦。
根据 Java 服务的期望,仔细检查生成的 C# 代理类和其中声明的任何命名空间(尤其是默认值 xmlns="")。可能会有非常细微的差异,您必须重新创建这些差异。
如果是这种情况,那么您将在 C# 属性中提供更多命名空间声明。
归档时间: |
|
查看次数: |
24132 次 |
最近记录: |