C# 从使用列表的.Net调用Java Web服务<;T>;
我正在开发一个Java web服务,它将被.Net客户端使用。该服务公开了一个方法,该方法接受一个对象作为参数,该对象有一个List类型的字段,Row类也有一个List类型的字段 现在,当Java客户机使用此服务时,它正确地将类型视为列表。然而,当.Net客户机使用此服务时,我最终得到的调用是一个类型为Value(例如Value[])的数组,而不是List 版本兼容性已设置为“.Net 3.5/METRO 1.3” 有人知道我如何让它与.Net和Java客户机一样工作,因为它们接受列表而不是值[] web服务的精简版本包括: 服务:C# 从使用列表的.Net调用Java Web服务<;T>;,c#,java,.net,web-services,C#,Java,.net,Web Services,我正在开发一个Java web服务,它将被.Net客户端使用。该服务公开了一个方法,该方法接受一个对象作为参数,该对象有一个List类型的字段,Row类也有一个List类型的字段 现在,当Java客户机使用此服务时,它正确地将类型视为列表。然而,当.Net客户机使用此服务时,我最终得到的调用是一个类型为Value(例如Value[])的数组,而不是List 版本兼容性已设置为“.Net 3.5/METRO 1.3” 有人知道我如何让它与.Net和Java客户机一样工作,因为它们接受列表而不是值[
@WebService(serviceName = "Test")
public class Test {
@WebMethod(operationName = "DataRequest")
public DataResponse DataRequest(DataRequest req) {
return new DataResponse();
}
}
数据请求:
public class DataRequest {
public DataType datType;
public String source;
public List<RowInfo> rows;
public String loginId;
}
在.Net客户端上,当我尝试构建请求对象时,它会将FeeDataRequest的rows字段视为值[][],而不是列表
.Net中的服务引用已配置为集合类型为System.Collections.Generic.List
关于如何使.Net正确地看到这一点,您有什么想法吗?只需使用数组,无论它在什么地方出现。您不必担心其他任何事情您可以发布web服务的WSDL吗 默认情况下,当生成WSDL时,列表对象将转换为数组。NET试图从WSDL构建对象类型
另外,如果您的RowInfo类只有一个值对象集合,那么在DataRequest中使用值对象集合而不是使用RowInfo对象集合,或者在服务之间发送数据是不容易的。我建议您先使用WSDL,然后从那里创建客户机和接口。然后映射到您需要在服务实现中处理的对象 您的模式类似于
<complexType name="DataRequest">
<all>
<element name="datType" type="DataType" />
<element name="source" type="string" />
<element name="rows">
<complexType>
<sequence>
<element name="row" type="RowInfo" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
</element>
<element name="loginId" type="string" />
</all>
</complexType>
然后是RowInfo,它使用了与行相同的模式。即minOccurs=“0”和maxOccurs=“unbounded”。这将使客户端生成器创建一个列表
<complexType name="RowInfo">
<sequence>
<element name="valueList" type="Value" minOccurs="0" maxOccurs="unbounded" />
</sequence>
<complexType>
最后一种类型是Value
<complexType name="Value">
<all>
<element name="name" type="string" />
<element name="value" type="string" />
</all>
</complexType>
最后,您需要一个包含元素
<element name="dataRequest" type="DataRequest" />
当然,上面的内容只是转述,您仍然需要在名称空间等中输入
新的Web服务开发人员(包括我自己)的一个问题是,我们认为只需编写Web服务并让代码生成来完成这项工作是一个好主意。不幸的是,在玩过它之后,我认为如果你有一个知道如何编写WSDL和XML模式的人,你会有更好的互操作性,并收获web服务的价值
特别是XML模式部分。我认为混合方法(代码优先的WSDL,但契约优先的模式)可能是最好的方法,因为您不需要处理重复执行绑定代码的问题。然而,理解它所需的技能变得越来越难。对于使用WSDL的跨语言集成,我强烈建议采用契约优先的方法,设计您的WSDL(+XSD),生成服务器端Java代码和客户端.net代码。这是一个多一点的工作,但你的机会更好,它的工作。+1到@home为打击它的鼻子广场。事实上,WS本机不支持Java集合或映射。尽管像Oracle这样的一些供应商有专有的扩展,您可以使用它们来实现这一点,但最好使用自顶向下的设计来实现跨平台web服务。谢谢@Perception。另一个(在我看来)优势是,您有一个以独立于语言的格式定义的显式契约,这在某种程度上迫使您保持接口的小型和紧凑性。我不理解为什么.NET客户端看到数组而不是列表是一个问题。如果它们传入数组,Java服务器将以列表的形式接收它们。您是否需要替换已经为其编写了客户端的现有服务?我认为如果您说出生成XML所使用的库以及生成的XML的外观,可能会有所帮助。无论如何,我会尝试使用别名或隐式数组(如果是XStream)来声明列表。问题不在于使用单个数组。如果它只需要一个数组,就不会有问题。然而,在本例中.Net看到的是锯齿状数组(值[][]),而不是我期望看到的RowInfo数组。这真的是个问题吗?在.NET中定义锯齿状数组有困难吗?@Paul对于后面的问题,我支持OP,这是一个问题。我真的很惊讶OP没有看到RowInfo数组。里面有些东西看起来可疑。@Alan您应该发布WSDL,您是否尝试过使用数组来代替,只是为了看看生成的WSDL是否被.net正确地选为行信息数组?
<complexType name="Value">
<all>
<element name="name" type="string" />
<element name="value" type="string" />
</all>
</complexType>
<element name="dataRequest" type="DataRequest" />