C#Web服务客户端转换错误

时间:2012-03-14 02:22:31

标签: c# java web-services web

我正在尝试使用Java Web服务但是获得异常System.InvalidCastException:无法将ValueArrayType类型的对象分配给ValueArrayType []

类型的对象

我正在使用第三方服务,因此无法更改服务,并且已被告知他们可以通过php和java使用该服务。

值数组类型是复杂类型

 <xsd:complexType name="ValueArrayType">
    <xsd:sequence>
    <xsd:element name="ValueName" type="xsd:string"/>
    <xsd:element name="ValueType" type="xsd:string"/>
    <xsd:element name="ValueValue" type="xsd:string"/>
    </xsd:sequence>
 </xsd:complexType>

响应DetailsType中的一个元素可以有多次出现,因为它具有max = unbound并且由sequence属性包装。

<xsd:complexType name="DetailsType">
    <xsd:sequence>
         <xsd:element name="Id" type="xsd:int"/>
         <xsd:element name="MobileName" type="xsd:string"/>
         <xsd:element name="ValueArray" type="tns:ValueArrayType" minOccurs="0" maxOccurs="unbounded"/>
   </xsd:sequence>
 </xsd:complexType>

我已尝试过wsdll.exe和svrcutil.exe来尝试生成客户端代码。 ValueArrayType在生成的代码中定义为数组。

public ValueArrayType[] ValueArray
{
    get
    {
        return this.valueArrayField;
    }
    set
    {
        this.valueArrayField = value;
    }
}

回来的数据的一个例子是。

....
<Details xsi:type="tns:DetailsType">
    <Id xsi:type="xsd:int">9999</Id>
    <ValueArray xsi:type="tns:ValueArrayType">
      <ValueName xsi:type="xsd:string">Count</ValueName>
      <ValueType xsi:type="xsd:string">numeric</ValueType>
      <ValueValue xsi:type="xsd:string">11</ValueValue>
    </ValueArray>
    <ValueArray xsi:type="tns:ValueArrayType">
      <ValueName xsi:type="xsd:string">Start</ValueName>
      <ValueType xsi:type="xsd:string">numeric</ValueType>
      <ValueValue xsi:type="xsd:string">31</ValueValue>
    </ValueArray>
    <ValueArray xsi:type="tns:ValueArrayType">
      <ValueName xsi:type="xsd:string">A1</ValueName>
      <ValueType xsi:type="xsd:string">numeric</ValueType>
      <ValueValue xsi:type="xsd:string">23</ValueValue>
    </ValueArray>
    <ValueArray xsi:type="tns:ValueArrayType">
      <ValueName xsi:type="xsd:string">A2</ValueName>
      <ValueType xsi:type="xsd:string">numeric</ValueType>
      <ValueValue xsi:type="xsd:string">0</ValueValue>
    </ValueArray>
    <ValueArray xsi:type="tns:ValueArrayType">
      <ValueName xsi:type="xsd:string">X1</ValueName>
      <ValueType xsi:type="xsd:string">numeric</ValueType>
      <ValueValue xsi:type="xsd:string">0</ValueValue>
    </ValueArray>
    .....

如果我将客户端代码更改为公共ValueArrayType ValueArray 而不是数组然后客户端工作,但只返回第一个ValueArray。

尝试了http://blogs.msdn.com/b/netcfteam/archive/2007/02/01/why-your-netcf-apps-fail-to-call-some-web-services.aspx的建议。

更新
我已经使用scvutil生成的proxyclass生成了一个WCF服务。 当我使用WCFTestCLient.exe消费并检查xml时。

将数组类型作为

发回
<ValueArray>
      <ValueArrayType>
        <ValueName>a</ValueName>
        <ValueType>string</ValueType>
        <ValueValue>1</ValueValue>
      </ValueArrayType>
      <ValueArrayType>
        <ValueName>a</ValueName>
        <ValueType>string</ValueType>
        <ValueValue>2</ValueValue>
      </ValueArrayType>
 </ValueArray> 

我假设发送的数据与WSDL不匹配,或者C#scvutil或System.ServiceModel中存在错误。

3 个答案:

答案 0 :(得分:0)

尝试在生成的代码中指定元素类型

[XmlElement(ElementName = "ValueArray", Type = typeof(ValueArrayType), Namespace = "YourSchemaNamespace")]
        public ValueArrayType[] ValueArray
        {
            get
            {
                return this.valueArrayField;
            }
            set
            {
                this.valueArrayField = value;
            }
        }

有关详情,请访问MSDN

答案 1 :(得分:0)

问题是由错误的WCF反序列化(described here)的错误xsi:type值引起的。

解决方法是在所有操作中使用OperationFormatUse.Literal而不是OperationFormatUse.Encoded

答案 2 :(得分:-2)

你能尝试这样的事吗?

JavaServecie js = new JavaService();

js.ValueArrayType arr = js.GetValues(.....

如果上课是公开的。