WCF. Сервисные универсальные методы - PullRequest
16 голосов
/ 25 мая 2010

Как я могу использовать универсальные методы в сервисе wcf?

Я написал этот код:

[OperationContract]
void AddItem<T>(T item);

Но я получаю следующую ошибку:

Тип 'T' не может быть экспортирован как тип схемы, потому что это открытый универсальный тип. Вы можете экспортировать универсальный тип, только если все его универсальные типы параметров являются фактическими типами.

Ответы [ 5 ]

29 голосов
/ 25 мая 2010

Вы просто не можете. Это невозможно сделать, так как мыло не поддерживает это. См. Эту статью , в которой упоминается, как обойти дженерики, создав промежуточный локальный объект, который вызывается и преобразует объект перед вызовом операции WCF.

6 голосов
/ 25 мая 2010

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

1 голос
/ 10 июля 2012

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

1 голос
/ 25 мая 2010

Как уже упоминалось, WCF и SOAP не поддерживают это. Проблема в том, что все, что вы передаете между клиентом и сервером, должно быть выражено в документе схемы XML.

XML-схема поддерживает все обычные атомарные типы, такие как string, int, datetime, и поддерживает сложные типы, состоящие из этих атомарных типов, и поддерживает наследование.

Но схема XML не поддерживает обобщенные элементы - и поэтому все, что вы обмениваетесь через WCF и SOAP, не может быть универсальным - вам нужно использовать только конкретные неуниверсальные типы.

Я тоже не знаю, как это обойти. Это ограничение, и вы должны жить с этим сейчас.

0 голосов
/ 10 ноября 2011

Ошибка говорит о том, что открытые типы не допускаются. Вероятно, разрешено что-то вроде:

[OperationContract]
void AddItem<T>(T item) where T : MyBaseType;

Конечно, все унаследованные типы должны быть добавлены с атрибутом KnownType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...