Проблема с использованием типов IEnumerable в качестве возвращаемых типов в WCF

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

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

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

Ответ 1

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

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

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

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

Это также поддерживает использование интерфейсов в качестве параметров метода сервиса, но не уверен в типах возврата.

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