Я делю контракт между моим клиентом и сервером (не используя сгенерированные прокси). Вот контракт (обратите внимание, я также пробовал ObservableCollection):
public class MyList : List<MyItem> {
public int Total { get; set; }
public MyList() { }
}
Значение Total все еще устанавливается, когда на сервере вызывается метод асинхронного обратного вызова EndMyOperation. Однако, когда я смотрю на значение на клиенте, значение Total исчезает (устанавливается в 0). Трассировка ясно показывает, что дополнительный атрибут не передается. Кто-нибудь может пролить свет на то, почему это происходит?
<MessageLogTraceRecord>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/MyOperation</Action>
<ActivityId CorrelationId="d2872ac2-685e-4f94-b516-aaba4effa463" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">695d611f-2b3d-48ca-80b8-7ceae4fd423f</ActivityId>
</s:Header>
<s:Body>
<MyOperationResponse xmlns="http://tempuri.org/">
<MyOperationResult xmlns:d4p1="http://schemas.datacontract.org/2004/07/MyDataContract" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<d4p1:MyItem>
<d4p1:MyId>1</d4p1:MyId>
</d4p1:MyItem>
<d4p1:MyItem>
<d4p1:MyId>12</d4p1:MyId>
</d4p1:MyItem>
</MyOperationResult>
</MyOperationResponse>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>
Просто чтобы уточнить, я знаю, что могу решить эту проблему, не занимая подклассы и делая что-то вроде ниже. Скорее я пытаюсь понять, почему вышеупомянутое поведение происходит.
public class MyPagedList<T> {
public int Total { get; set; }
public List<T> MyList { get; set; }
public MyPagedList() { MyList = new List<T>(); }
}