9

我的任务是向第 3 方 Web 服务发送数据,他们提供了一个测试服务,该服务被证明可以与 Java 客户端一起使用,但是,它不在 .Net 中。

当我生成服务代理并实例化服务或序列化请求对象时,我收到以下错误:

Unable to generate a temporary class (result=1). 
error CS0030: Cannot convert type 'TestStarXML.wsStarService.VSOptionInclusiveSetType[]' to 'TestStarXML.wsStarService.VSOptionInclusiveSetType' 
error CS0030: Cannot convert type 'TestStarXML.wsStarService.VSOptionConflictSetType[]' to 'TestStarXML.wsStarService.VSOptionConflictSetType'
error CS0030: Cannot convert type 'TestStarXML.wsStarService.ColorRequirementSetType[]' to 'TestStarXML.wsStarService.ColorRequirementSetType' 
error CS0030: Cannot convert type 'TestStarXML.wsStarService.ColorExclusionSetType[]' to 'TestStarXML.wsStarService.ColorExclusionSetType' 
error CS0029: Cannot implicitly convert type 'TestStarXML.wsStarService.VSOptionInclusiveSetType' to 'TestStarXML.wsStarService.VSOptionInclusiveSetType[]' 
error CS0029: Cannot implicitly convert type 'TestStarXML.wsStarService.VSOptionConflictSetType' to 'TestStarXML.wsStarService.VSOptionConflictSetType[]' 
error CS0029: Cannot implicitly convert type 'TestStarXML.wsStarService.ColorRequirementSetType' to 'TestStarXML.wsStarService.ColorRequirementSetType[]' 
error CS0029: Cannot implicitly convert type 'TestStarXML.wsStarService.ColorExclusionSetType' to 'TestStarXML.wsStarService.ColorExclusionSetType[]'

向我们发送此服务的第 3 方使用 Java,他们从测试服务生成服务代理没有问题。到目前为止,我的理解是 .Net 中存在一个错误(请参见此处)为 WSDL 文件生成 XSD。

在此处的答案中,它提到使用虚拟属性修改生成的 XSD,因此我按照建议添加了虚拟属性:

<xs:complexType name="VSInclusivesOptionType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="VSOptionInclusiveSet" type="tns:VSOptionInclusiveSetType" />
    </xs:sequence>
    <xs:attribute name="tmp" type="xs:string" />   <!-- this is all I have added (for each of the types in the exception message) -->
  </xs:complexType>
  <xs:complexType name="VSOptionInclusiveSetType">
    <xs:sequence>
      <xs:element minOccurs="0" name="SetID" type="ns2:IdentifierType" />
      <xs:element minOccurs="0" name="NumberOfOptionsNumeric" type="xs:decimal" />
      <xs:element minOccurs="0" maxOccurs="unbounded" name="VSOption2" type="tns:VSOption2Type" />
    </xs:sequence>
  </xs:complexType>

添加 dummy 属性的唯一实现是将项目的编译时间从几分钟减少到几秒钟。

除此之外,VS2008 似乎没有注意到这些变化——如果没有上述异常,我仍然无法序列化对象或实例化服务,我错过了什么或做错了什么?

4

2 回答 2

7

您必须按照我的问题更改 XSD 文件,但您还必须修改同一文件夹中的 Reference.cs(或 .vb)文件 - 我在 [][] 上用 [] (或 () () 与 () 在 vb.net 中)。

在我所做的所有阅读中,没有答案说两者都可以,所以我只是错过了重点 - 我希望这个答案对其他人有所帮助。

于 2012-05-15T09:24:55.300 回答
5

你是对的,这是 WSDL 工具中的一个错误。要更正错误,您应该打开生成的文件并将一些“TestStarXML.wsStarService.VSOptionConflictSetType”更改为“TestStarXML.wsStarService.VSOptionConflictSetType[]”。

运行时,您可以轻松找到哪些。更改类型后,您的服务将正常运行。

于 2012-05-15T08:24:55.650 回答