Вопрос

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

[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 этого сервиса должно привести к появлению в WSDL всплывающего окна ArticleImage.К сожалению, этого вообще не происходит.Почему это?

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

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


Это результат большого количества испытаний:

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

Решение

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

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

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


Что касается LINQ-to-SQL;предметы для «мекса» нужно украсить [DataContract] / [DataMember].Вы можете сделать это в проекте, переключив свойство «сериализация» для файла dbml.С этим набором (Режим сериализации = Однонаправленный) должно работать.Однако, если честно, я думаю, что лучше просто добавить фиктивный метод, который делает тип явным в API.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top