我是新来的WCF.我正在做一些简单的RESTful WCF操作合同.而且,我BodyStyle对属性类的属性选项有疑问WebInvoke.一种选择是WebMessageBodyStyle.Bare,另一种是WebMessageBodyStyle.Wrapped.
Bare?Wrapped?谢谢您的帮助.
Kon*_*osa 117
假设您与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;
}
Run Code Online (Sandbox Code Playgroud)
根据组合BodyStyle,RequestFormat和ResponseFormat你将有不同的格式,但一般:
JSON和WebMessageBodyStyle.Bare请求和响应将是:
请求:
{"Name":"name","Value":"value"}
Run Code Online (Sandbox Code Playgroud)
响应:
{"Name":"ResultName:name","Value":"ResultValue:value"}
Run Code Online (Sandbox Code Playgroud)
JSON和WebMessageBodyStyle.Wrapped请求和响应将是:
请求:
{"entity":{"Name":"name","Value":"value"}}
Run Code Online (Sandbox Code Playgroud)
响应:
{"DoWorkResult":{"Name":"name","Value":"value"}}
Run Code Online (Sandbox Code Playgroud)
注意:您可以更改DoWorkResult自己的默认名称:
[return: MessageParameter(Name = "MyResult")]
Entity DoWork(Entity entity);`
Run Code Online (Sandbox Code Playgroud)
所以从现在开始这将是:
{"MyResult":{"Name":"name","Value":"value"}}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
响应:
<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>
Run Code Online (Sandbox Code Playgroud)
XML和WebMessageBodyStyle.Wrapped请求和响应将是:
请求:
<DoWork xmlns="http://tempuri.org/">
<entity>
<Name>name</Name>
<Value>value</Value>
</entity>
</DoWork>
Run Code Online (Sandbox Code Playgroud)
响应:
<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>
Run Code Online (Sandbox Code Playgroud)
注意:您也可以使用更改默认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);
Run Code Online (Sandbox Code Playgroud)
服务会抛出异常:
"合同"操作''指定要序列化的多个请求体参数,而不包含任何包装元素.最多可以在没有包装元素的情况下序列化一个body参数.删除额外的body参数或将WebGetAttribute/WebInvokeAttribute上的BodyStyle属性设置为Wrapped.