svcutil пропускает атрибут ServiceKnownType из сгенерированного прокси интерфейса - PullRequest
5 голосов
/ 03 апреля 2009

Я столкнулся с проблемой при попытке реализовать пример 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. Кто-нибудь знает, как решить эту проблему?

Спасибо

Ответы [ 3 ]

1 голос
/ 21 сентября 2011

Я потратил часы сегодня на то, что, насколько я могу судить, является точно такой же проблемой. Решением для меня было использование метода AddGenericResolver из библиотеки ServiceModelEx IDesign.

ПРИМЕЧАНИЕ. Требуется .NET 4.0, поскольку он использует DataContractResolver

Вы можете найти его на странице IDesign Downloads .

Все, что мне нужно было сделать в моем случае, это добавить следующую строку кода:

Client.AddGenericResolver( typeof ( K2Source ) );

Надеюсь, это поможет кому-то еще сэкономить несколько часов!

Дополнительную информацию можно найти в книге Юваля Лоуи «Программирование служб WCF: освоение WCF и служебная шина Azure AppFabric».

0 голосов
/ 21 апреля 2017

Проблема с игнорируемым ServiceKnownType от svcutil все еще здесь. Мое решение состоит в том, чтобы добавить «известные типы» к справке по клиентскому контракту программно:

var client = new ServiceReferenceClient("clientEndpoint");
foreach (var o in client.Endpoint.Contract.Operations)
{
   o.KnownTypes.Add(typeof(MyType01));
   o.KnownTypes.Add(typeof(MyType02));
   o.KnownTypes.Add(typeof(MyType03));
}

Это не идеальное решение (должно быть жестко задано на стороне клиента), но оно работает для меня.

0 голосов
/ 03 апреля 2009

Кажется, что связана проблема .

Вы пытались вернуть общий словарь виджетов и поместить [KnownType(typeof(Machine))] в класс виджетов?

...