Формат тела веб-службы RESTful

Я новичок в WCF. Я делаю несколько простых контрактов на работу с RESTful WCF. И у меня есть вопрос о вариантах для свойства «BodyStyle» classа атрибутов «WebInvoke». Один из вариантов – WebMessageBodyStyle.Bare, а другой – WebMessageBodyStyle.Wrapped. Когда следует использовать Bare? Когда следует использовать Wrapped?

Спасибо за помощь.

Предположим, что у вас есть контракт с XML-запросом / ответом и некоторым простым контрактом на передачу данных:

[ServiceContract] public interface IService { ... [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] Entity DoWork(Entity entity); ... } [DataContract] public class Entity { [DataMember] public string Name; [DataMember] public string Value; } 

В зависимости от комбинации BodyStyle , RequestFormat и ResponseFormat вас будут разные форматы, но в целом:

JSON и WebMessageBodyStyle.Bare Запрос и ответ будут следующими:

Запрос:

 {"Name":"name","Value":"value"} 

Отклик:

 {"Name":"ResultName:name","Value":"ResultValue:value"} 

JSON и WebMessageBodyStyle.Wrapped запрос и ответ будут следующими:

Запрос:

 {"entity":{"Name":"name","Value":"value"}} 

Отклик:

 {"DoWorkResult":{"Name":"name","Value":"value"}} 

Примечание . Вы можете изменить имя DoWorkResult умолчанию:

 [return: MessageParameter(Name = "MyResult")] Entity DoWork(Entity entity);` 

так что теперь это будет:

 {"MyResult":{"Name":"name","Value":"value"}} 

XML и WebMessageBodyStyle.Bare запрос и ответ будут:

Запрос:

  name value  

Отклик:

  name value  

XML и WebMessageBodyStyle.Wrapped запрос и ответ будут:

Запрос:

    name value   

Отклик:

    name value   

Примечание : вы также можете изменить имя DoWorkResult умолчанию с return: MessageParameter

Чтобы ответить на ваш вопрос, который должен использовать WebMessageBodyStyle , зависит от ваших потребностей, и здесь нет золотого правила. Для обеспечения совместимости иногда может потребоваться тот или иной формат. Но имейте в виду об одном ограничении стиля голого тела: поскольку в формате XML есть только один корень и один объект в формате JSON, только один параметр может быть передан методу. Фактически, если вы изменили контракт на обслуживание на что-то вроде:

 [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] Entity DoWork(string id, Entity entity); 

служба будет генерировать исключение:

Операция ” контракта ” задает несколько параметров тела запроса, которые должны быть сериализованы без каких-либо элементов-оберток. Не более одного параметра тела можно сериализовать без элементов обертки. Удалите дополнительные параметры тела или установите свойство BodyStyle в атрибуте WebGetAttribute / WebInvokeAttribute для обертывания.

Использование обернутого в описании операции просто переносит запрос (или ответ) в элемент XML. Например, в этом контракте:

 [ServiceContract] public interface ITest { [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)] string Echo(string text); [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] string EchoWrapped(string text); [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] int Divide(int dividend, int divisor, out int reminder); } 

Вход для операции Echo – это просто элемент с текстом, содержащимся внутри. Аналогично, его ответ содержит один элемент с возвратом операции. Для операции EchoWrapped вход представляет собой элемент, чей дочерний элемент является элементом, дочерний элемент которого содержит вход для метода.

Что ожидает сервис Echo:

 The input 

Что ожидает сервис EchoWrapped:

 Hello wrapped 

Источник: http://social.msdn.microsoft.com/Forums/vstudio/en-US/9db6793b-8db9-479b-825c-e781d023f6c1/bodystylewebmessagebodystylewrapped-with-requestformatwebmessageformatxml-for-post?forum=wcf

Interesting Posts

Как скрыть уведомления Teamviewer (молчаливое использование)

Почему приведение int к недопустимому значению enums НЕ выбрасывает исключение?

jQuery: содержит селектор для поиска нескольких строк

Как изменить css display none или заблокировать свойство с помощью JQuery?

Разница между 3NF и BCNF в простых терминах (должна быть в состоянии объяснить 8-летнему ребенку)

Memtest замерзает на 16%

Существует ли просмотр в Asp.Net MVC?

Загружает ли Torrents чрезмерный износ жестких дисков?

Лучше ли определять состояние в конструкторе или использовать инициализаторы свойств?

Лучший способ конвертировать поле строки в метку времени в Spark

Как разместить один элемент относительно другого с помощью jQuery?

Связывание данных с TextBlock.Inlines

Вложенные маршруты в реакционном маршрутизаторе v4

Зачем нужна нелинейная активационная функция в нейронной сети обратного распространения?

Являются ли адаптеры HDMI для VGA действительно специфичными для устройства?

Давайте будем гением компьютера.