1

我有一个 WCF Web 服务,我的 C++ 客户端使用 svcutil + wsutil 生成的代理与之交谈。我添加了一个新的 DataMember,现在我得到:

读取具有 WS_READ_OPTION '2'、名称 'GetMachineRequestDetailsResponse' 和命名空间 'M.NativeOM' 的元素时发生序列化失败。读取具有 WS_TYPE '26 (0x1A)'、WS_FIELD_MAPPING '2'、名称 'GetMachineRequestDetailsResult' 和命名空间 'M.NativeOM' 的字段时发生序列化失败。当 XML 阅读器处理输入源时,第 1 行第 796 列 (0x31C) 发生错误。预期有一个结束元素。找到了一个名为“UseForRun_SnapshotID ”和命名空间“M.NativeOM”的开始元素,但不是预期的。

我在数据合同中的数据成员是使用 Order 属性定义的:

[DataMember(Order = 4)]
        public int MachineID { get; set; }
        [DataMember(Order = 5)]
        public string MachineName { get; set; }

        [DataMember(Order = 3)]
        public bool IsReserved { get; set; }

        [DataMember(Order = 13)]
        public string ReservedBy { get; set; }

        [DataMember(Order = 12)]
        public MdMachineRequestType RequestType { get; set; }

        [DataMember(Order = 0)]
        public bool CommandIsAdmin { get; set; }
        [DataMember(Order = 1)]
        public string CommandLine { get; set; }
        [DataMember(Order = 2)]
        public int CommandTimeout { get; set; }

        [DataMember(Order = 7)]
        public string MoveToDb_ServerName { get; set; }
        [DataMember(Order = 6)]
        public string MoveToDb_DatabaseName { get; set; }

        [DataMember(Order = 11)]
        public int Reimage_OsID { get; set; }
        [DataMember(Order = 8)]
        public int Reimage_ImageID { get; set; }
        [DataMember(Order = 9)]
        public int Reimage_OptionTimeout { get; set; }
        [DataMember(Order = 10)]
        public string Reimage_OptionUserName { get; set; }

        [DataMember(Order = 15)]
        public int UseForRun_RunID { get; set; }
        [DataMember(Order = 14)]
        public bool UseForRun_DoCleanInstall { get; set; }

        [DataMember(Order = 16)]
        public int UseForRun_SnapshotID { get; set; }

此外,生成的 xsd 文件以正确的顺序显示它们

  <xs:complexType name="MdMachineRequest">
    <xs:sequence>
      <xs:element minOccurs="0" name="CommandIsAdmin" type="xs:boolean" />
      <xs:element minOccurs="0" name="CommandLine" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CommandTimeout" type="xs:int" />
      <xs:element minOccurs="0" name="IsReserved" type="xs:boolean" />
      <xs:element minOccurs="0" name="MachineID" type="xs:int" />
      <xs:element minOccurs="0" name="MachineName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="MoveToDb_DatabaseName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="MoveToDb_ServerName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="Reimage_ImageID" type="xs:int" />
      <xs:element minOccurs="0" name="Reimage_OptionTimeout" type="xs:int" />
      <xs:element minOccurs="0" name="Reimage_OptionUserName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="Reimage_OsID" type="xs:int" />
      <xs:element minOccurs="0" name="RequestType" type="tns:MdMachineRequestType" />
      <xs:element minOccurs="0" name="ReservedBy" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="UseForRun_DoCleanInstall" type="xs:boolean" />
      <xs:element minOccurs="0" name="UseForRun_RunID" type="xs:int" />
      <xs:element minOccurs="0" name="UseForRun_SnapshotID" type="xs:int" />
    </xs:sequence>
  </xs:complexType>

因此,使用 Order 属性确实将 DataMember 置于正确的顺序中,但我的客户不仅忽略了新的 DataMember 而是给出了错误。

4

1 回答 1

0

问题是当我使用 wsutil 创建代理时,我缺少 /ignoreTrailingContent 选项

于 2012-09-10T22:17:34.110 回答