Есть ли способ вернуть разные типы из метода REST WCF?

StackOverflow https://stackoverflow.com/questions/140255

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

См. БлогSvc и более конкретно Рестатомпубсервице.cs служба WCF Больше подробностей.Обратите внимание: этот исходный код также покажет вам, как принимать различные типы данных в метод отдыха WCF, для которого требуется преобразователь типов контента.

Другие советы

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

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

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

Если у вас возникли проблемы со службами данных ADO.NET, у меня меньше опыта в этом вопросе.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top