C# 从使用列表的.Net调用Java Web服务<;T>;

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客户机一样工作,因为它们接受列表而不是值[

我正在开发一个Java web服务,它将被.Net客户端使用。该服务公开了一个方法,该方法接受一个对象作为参数,该对象有一个List类型的字段,Row类也有一个List类型的字段

现在,当Java客户机使用此服务时,它正确地将类型视为列表。然而,当.Net客户机使用此服务时,我最终得到的调用是一个类型为Value(例如Value[])的数组,而不是List

版本兼容性已设置为“.Net 3.5/METRO 1.3”

有人知道我如何让它与.Net和Java客户机一样工作,因为它们接受列表而不是值[]

web服务的精简版本包括:

服务:

    @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" />