SOAP абстракция через классы не работает должным образом? - PullRequest
0 голосов
/ 20 февраля 2019

Оригинальный контракт SOAP в WCF (я специально пропустил атрибуты 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 ничего не меняется, НО это ломает старуюклиенты.

Почему это так?Как добиться гибкости REST в SOAP, где вы можете просто добавить поле / переместить его из конкретного класса в абстракцию, и все работает?

1 Ответ

0 голосов
/ 21 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...