我正在尝试使用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。
更新
我已经使用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中存在错误。
答案 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(.....
如果上课是公开的。