Я столкнулся с проблемой при попытке реализовать пример ServiceKnownType из MSDN.
В примере они предоставляют следующие классы:
[DataContract()]
public class Widget
{
[DataMember]
public string Id;
[DataMember]
public string Catalog;
}
[DataContract()]
public class Machine : Widget
{
[DataMember]
public string Maker;
}
И следующий интерфейс:
[ServiceKnownType(typeof(Widget))]
[ServiceKnownType(typeof(Machine))]
[ServiceContract()]
public interface ICatalog
{
[OperationContract]
Hashtable GetItems();
}
Проблема в том, что при создании прокси-класса (с использованием «Добавить ссылку на службу» / svcutil.exe) атрибуты «ServiceKnownType» не включаются в интерфейс прокси ICatalog, что приводит к получению исключения
«Форматировщик выдал исключение при попытке десериализации сообщения:…
Добавить тип, соответствующий «Виджет» в список известных типов »
Чтобы решить эту проблему, я должен вручную добавить известные атрибуты службы в сгенерированный прокси-интерфейс, что является очень плохим решением, поскольку код обновляется при обновлении ссылки.
Интересно во всей этой ситуации, что если операция GetItems вернет объект вместо Hashtable или получит объект в качестве параметра, то проблема будет решена, то есть
[OperationContract]
object GetItems();
или
[OperationContract]
Hashtable GetItems(object obj);
приводит к наличию атрибута «ServiceKnownType» в интерфейсе прокси ICatalog.
Кто-нибудь знает, как решить эту проблему?
Спасибо