Проблема с использованием типов IEnumerable в качестве возвращаемых типов в WCF - PullRequest
10 голосов
/ 02 мая 2011

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

Я встречал много статей и форумов, но чтоДо сих пор у меня есть способы предотвращения ошибок с другими альтернативными решениями, такими как массив объектов или общий список List.

Я хотел бы, чтобы члены сообщества предложили более релевантные публикации или любой справочный материал, который объяснял бы такое поведение WCF.

1 Ответ

22 голосов
/ 02 мая 2011

WCF использует систему передачи сообщений - он сериализует вызовы и возвращает значения в сериализованные сообщения XML.

Таким образом, он может иметь дело только с вещами, которые могут быть выражены в схеме XML - и интерфейсы не могут быть выраженыв XML-схеме.

Попробуйте вместо этого использовать конкретный тип (List<T> или массив) - они должны работать просто отлично.

Есть несколько способов получитьвокруг этого - но вы жертвуете любой возможностью взаимодействия с не-.NET-клиентами в процессе: вы можете использовать NetDataContractSerializer (см. это сообщение в блоге и статью Аарона Сконнарда о NetDataContractSerializer );с этим вы в основном встраиваете дополнительную информацию .NET во время выполнения в свои сериализованные сообщения.Это сделает ваши сообщения больше, и любой клиент, не являющийся .NET, этого не поймет, но если вы контролируете оба конца провода, а оба конца - только .NET, то это может работать в качестве обходного пути.

Это также поддерживает использование интерфейсов в качестве параметров вашего метода обслуживания - хотя и не уверен насчет типов возвращаемых данных.

Обычно я не рекомендую этого - но в зависимости от вашей ситуации и ваших потребностей это может быть альтернативойвы.Проверьте это!

...