通过类的SOAP抽象无法正常工作?

时间:2019-02-20 08:40:09

标签: c# rest wcf

WCF中的原始SOAP合同(我出于可读性而故意省略了DTO属性):

public class A : B
{
    public int Field1 {get;set;}

    public int Field2 {get;set;}
}

public abstract class B 
{
    public int Field3 {get;set;}
}

一段时间后,原始合同交给了客户,他们使用了它。大家开心。但是后来我决定将一个字段移到抽象级别:

public class A : B
{
    public int Field2 {get;set;}
}

public abstract class B 
{        
    public int Field1 {get;set;}//heh, become abstract

    public int Field3 {get;set;}
}

因此,基本上,只要将此字段添加到每个具体类中,都是一样的,而对于A不变,但这会破坏旧客户端。

为什么会这样?如何在SOAP中实现REST灵活性,您可以在其中添加字段/将字段从具体类移动到抽象,然后一切正常?

1 个答案:

答案 0 :(得分:0)

wcf以正确的顺序序列化和反序列化数据。 顺序是抽象类的第一属性,然后是子类的属性。 因此,原始DataContact的顺序为Field3-> 1,Field1-> 2,Field2-> 3。

然后将Field1移至抽象类,因此顺序为Field1-> 1,Field3-> 2,Field2-> 3。

更改后,客户端和服务器端的属性顺序不匹配。因此,您应该更改抽象类的顺序。

 [DataContract]
public abstract class Parent
{
   // IsRequired is used to test whether has received the property

 // if not, it will show error. Order could change the order of the property in message 
    [DataMember(IsRequired = true,Order =1)]
    public int Field3 { get; set; }
    [DataMember(IsRequired = true,Order =2)]
    public int Field1 { get; set; }

}

我知道这种方式仅适用于较小的更改,如果您想进行大量更改,请考虑使用DataContractSurrogate https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/data-contract-surrogates