Есть ли способ вернуть разные типы из метода WCF REST? - PullRequest
6 голосов
/ 26 сентября 2008

Я пытаюсь написать веб-сервис для спецификации, и он требует другого тела ответа в зависимости от того, успешно ли завершен метод или нет. Я попытался создать два разных класса DataContract, но как я могу их вернуть и правильно сериализовать?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2008

Лучший способ указать, что ваш веб-сервис WCF завершился неудачей, - это выдать исключение FaultException. В файлах web.config вашей службы есть настройки, позволяющие передавать сообщение об ошибке клиенту как часть ошибки.

Другим подходом может быть наследование обоих ваших результатов от одного базового класса или интерфейса. Служба будет возвращать экземпляр базового типа. Затем вы можете использовать атрибут KnownType, чтобы сообщить клиенту, что может быть возвращено несколько типов. Если подумать, возможно, можно использовать Object в качестве базового типа, но я не пробовал.

В случае неудачи любого из этих подходов вы можете создать пользовательский объект результата, который будет содержать как свойства результата, так и ошибки, и ваш клиент сможет затем решить, какие действия предпринять. Мне пришлось использовать этот подход для Silverlight 2, потому что бета-версия 2 еще не полностью поддерживает контракты на отказ. Это не красиво, я обычно не рекомендую это, но если это единственный способ, который работает, или вы чувствуете, что это лучший подход для вашей ситуации ...

Если у вас проблемы с ADO.NET Data Services, у меня там меньше опыта.

Вот некоторая информация о реализации FaultContracts

1 голос
/ 26 сентября 2008

Ответ да , но это сложно, и вы теряете строгую типизацию на своем интерфейсе. Если вы вернете Stream , тогда данные могут быть в формате xml, текста или даже двоичного изображения. Для классов DataContract вы затем сериализуете данные, используя DataContractSerializer .

См. BlogSvc и, более конкретно, RestAtomPubService.cs Служба WCF для получения дополнительной информации. Обратите внимание, что исходный код также покажет вам, как принимать различные типы данных в метод отдыха WCF, для которого требуется сопоставитель типов контента.

0 голосов
/ 26 сентября 2008

Если вы используете связывание на основе xml, то я считаю, что нет никакого способа сделать это. Простое решение в этом случае состоит в том, чтобы просто иметь часть флага сообщения, если произошел сбой, и хранить информацию о сбое где-нибудь, если это необходимо. Для привязки JSON вы можете использовать метод, который возвращает объект, а затем возвращает два разных типа объектов. Если я правильно помню (что редко), это возможно, потому что класс JavaScriptSerializer использует отражение, если объект очищен от атрибутов сериализации.

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