Как я могу отправить IList через службу WCF? - PullRequest
1 голос
/ 18 июля 2011

Я хочу использовать NHibernate в своей службе WCF. Как я могу отправить IList через службу WCF?

--- EDIT -------

Можно ли поставитьIList в переменной object и отправить его?

Ответы [ 4 ]

3 голосов
/ 18 июля 2011

Попытка передать IList<T> на самом деле не подходит для службы на основе WCF.

WCF взаимодействует в терминах контрактов на данные, определяя форму данных, которые служба или клиент ожидают отправитьи получить.Эти контракты должны быть достаточно конкретными, чтобы сериализаторы знали, как преобразовать их в XML, JSON и другие представления.

Когда вы добавляете интерфейс типа IList<T> в свои контракты на обслуживание, вы не предоставляете сериализаторуДостаточно информации об указанной форме ваших данных.Вас интересует только отправка IList<T> части реализации?Вас интересуют какие-либо другие данные с состоянием, содержащиеся в чем-то, реализующем интерфейс?Сериализаторы не могут знать.

Самое простое решение - использовать базовые объекты передачи данных с WCF.Это простые классы, которые предназначены только для представления информации, передаваемой через носитель.Эти классы содержат только конкретные типы и легко понимаются сериализаторами.Когда вы хотите отправить сообщение, вы создаете экземпляры этих объектов и заполняете их данными.

Для вашего примера создайте List<T> вместо IList<T> и скопируйте значения в список перед передачей его всервис.Простой способ сделать это с помощью метода расширения Enumberable.ToList<T>().

2 голосов
/ 18 июля 2011

Сериализатору необходимо знать конкретный тип, поэтому аннотируйте контракт с [ServiceKnownType], чтобы он знал, какие типы могут использоваться для IList

Обновление: объект не помогает, так как сериализатор все еще не знает, что делать - вам нужно будет указать это с помощью [ServiceKnownType] - вы можете указать здесь метод, который возвращает список типы, если вы не хотите быть явным во время компиляции

1 голос
/ 18 июля 2011

Вам нужно использовать дженерики и пометить, какой это тип списка, чтобы служба знала, чего ожидать.Метод может выглядеть следующим образом:

public IList<Something> GetSomething()

Тем не менее, когда я делаю это, я склонен возвращать массив вместо этого только потому, что при чтении кода меньше угадывается, что именно он собирается вернутьне клиент WCF на другом конце создает для него класс IList или он конвертирует его во что-то еще?).Все знают, что такое массив.

0 голосов
/ 03 июля 2012

В дополнение к концепции использования типа List
- почему бы просто не использовать массив?

Массив кажется наиболее очевидным выбором, поскольку он совместим с IEnumerable, и клиент может использовать свои собственные методы расширения

...