Как получить неизвестный тип из службы wcf? - PullRequest
3 голосов
/ 24 января 2009

В настоящее время я работаю над сервисом wcf, который выполняет поиск в базе данных и возвращает данные клиенту. Пользователь ввел идентификатор того, что он хочет видеть в текстовом поле. Это может быть идентификатор клиента, идентификатор продукта, идентификатор заказа или что-то еще. Метод поиска на сервере пытается найти идентификатор в таблице клиента. Если его там нет, он идет на таблицу продуктов и т. Д., Пока не будет найден.

При звонке на сервер невозможно сказать, что ищет пользователь. Насколько я знаю, мне нужно указать время разработки возвращаемого типа, иначе сериализация объектов не будет работать. Единственное, что я могу придумать, - это вспомогательный класс, содержащий все возможные объекты и вернуть его из wcfservice, есть идеи получше?

Дополнительная информация: Мы используем wsHttpBinding и Linq-To-Sql. База данных является устаревшей, а также использует другое программное обеспечение, поэтому объекты данных не могут быть изменены.

Ответы [ 2 ]

1 голос
/ 24 января 2009

Ваше решение должно работать. Другие решения:

  1. Если ваши типы имеют общий базовый класс (например, Object ;-)), вы можете объявить веб-сервис для возврата этого класса и использовать атрибут KnownTypes , чтобы сообщить WCF, как сериализовать / десериализовать подклассы
  2. Позвольте веб-сервису возвращать XML, сериализовать и десериализовать ваш XML самостоятельно. Вы находитесь под полным контролем, но это, вероятно, много дополнительной работы.
1 голос
/ 24 января 2009

Вы не упомянули привязку, которую используете для своего сервиса. Если это связывание на основе SOAP, такое как wsHttpBinding или basicHttpBinding, то все возможные типы, которые ваш метод может вернуть, должны быть известны во время компиляции, чтобы они могли быть представлены в WSDL, а клиенты могли генерировать прокси-классы. В этом случае вам нужно определить базовый класс, содержащий идентификатор, из которого будут извлечены все ваши сущности, и использовать либо ServiceKnownTypeAttribute , либо перечислить их в файле app.config / web.config:

<system.runtime.serialization>
    <dataContractSerializer>
        <declaredTypes>
            <add type="MyNamespace.Entity">
                <knownType type="MyNamespace.Client" />
                <knownType type="MyNamespace.Product" />
                <knownType type="MyNamespace.Order" />
            </add>
        </declaredTypes>
    </dataContractSerializer>
</system.runtime.serialization>

Если вы используете двоичную сериализацию по TCP, то нет необходимости указывать известные типы во время компиляции, потому что двоичные сериализаторы будут передавать информацию о типе.

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