Ответ 1
Предположим, что у вас есть контракт с 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
запрос и ответ будут следующими:
Запрос:
<Entity xmlns="http://schemas.datacontract.org/2004/07/WcfService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>name</Name>
<Value>value</Value>
</Entity>
Ответ:
<Entity xmlns="http://schemas.datacontract.org/2004/07/WcfService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>name</Name>
<Value>value</Value>
</Entity>
XML и WebMessageBodyStyle.Wrapped
запрос и ответ будут следующими:
Запрос:
<DoWork xmlns="http://tempuri.org/">
<entity>
<Name>name</Name>
<Value>value</Value>
</entity>
</DoWork>
Ответ:
<DoWorkResponse xmlns="http://tempuri.org/">
<DoWorkResult xmlns:a="http://schemas.datacontract.org/2004/07/WcfService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Name>name</a:Name>
<a:Value>value</a:Value>
</DoWorkResult>
</DoWorkResponse>
Примечание: вы также можете изменить имя по умолчанию 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 to Wrapped.