ServiceKnownTypeAttribute не появляется в WSDL
-
19-09-2019 - |
Вопрос
У меня есть сервисный интерфейс:
[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 публикуются только типы, используемые в качестве входных/выходных параметров операций контракта службы.