ServiceKnownTypeAttribute не появляется в WSDL - PullRequest
1 голос
/ 14 декабря 2009

У меня есть сервисный интерфейс:

[ServiceContract]
[ServiceKnownType(typeof(Models.ArticleImage))]
public interface IPhotoManagementService
{
    [OperationContract]
    bool Login(string username, string password);

    [OperationContract]
    bool IsLoggedIn();

    [OperationContract]
    void UpdateImage(string articleID, string selectedImage);
}

Как видите, я указываю typeof (Models.ArticleImage) в моем ServiceContract.

Таким образом, создание WSDL этого сервиса должно вызвать появление ArticleImage в WSDL. К сожалению, этого не происходит вообще. Почему это?

ArticleImage имеет DataContract на нем. И когда я возвращаю ArticleImage в моем интерфейсе, тогда WSDL получает ArticleImage.

Редактировать: он даже не появляется в справочнике услуг в потребляющем проекте!


Это результат большого тестирования:

  • Модель, которую я пытаюсь добавить, - это модель LINQ to SQL.
  • Когда я добавляю обычную модель с ServiceKnownType, она работает.
  • Когда я использую свои сущности LINQ to SQL в своем интерфейсе, это работает.
  • Когда я добавляю свой объект LINQ to SQL через ServiceKnownType, он не появляется.

Ответы [ 2 ]

1 голос
/ 14 декабря 2009

В WSDL публикуются только типы, используемые в качестве параметров ввода-вывода операций контракта на обслуживание.

0 голосов
/ 14 декабря 2009

Зачем это нужно? Где ваша служба раскрывает то, что возможно может быть ArticleImage?

Re ваш комментарий; при использовании [ServiceKnownType] дополнительный трип по-прежнему отображается в «mex» (используется через «svcutil»), но не WSDL. Вы используете клиент WCF? Он должен появиться (я только что проверил ... это сделал). В целом, однако, возвращать расплывчатые данные из веб-сервиса не очень хорошая идея ... подтипы, конечно! Dictionary<string,ArticleImage> или даже Dictionary<string,SomeBaseType>[KnownType] и т. Д.), Хорошо! Но object, HashTable и т. Д. - не очень хорошая идея (ИМО).

Вы также можете просто вернуть список вашего типа (List<ArticleImage>), который будет работать во всех сценариях (и будет легким для WSDL и т. Д.); и пусть клиент делает словарь в конце.


Что касается LINQ-to-SQL; объекты для "mex" должны быть украшены [DataContract] / [DataMember]. Вы можете сделать это с помощью переключателя «serialization» для dbml. С этим набором (Serialization Mode = Unidirectional) он должен работать. Честно говоря, я думаю, вам будет лучше, если вы добавите фиктивный метод, который делает тип явным в API.

...