2012-08-28 37 views
1

我有一个WCF Web服务,我的C++客户端使用由svcutil + wsutil生成的代理进行通信。 我添加了一个新的DataMember,现在我得到:反序列化失败,由于新的WCF 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'的起始元素,但没有预期。

[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> 

因此,使用顺序属性并把数据成员:

我在一个datacontract数据成员是使用订单属性定义按照正确的顺序,但我的客户端不会忽略新的DataMember,而是给出一个错误。

回答

0

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