RESTful Web服务正文格式

Tho*_*enz 49 wcf

我是新来的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,RequestFormatResponseFormat你将有不同的格式,但一般:

JSONWebMessageBodyStyle.Bare请求和响应将是:

请求:

{"Name":"name","Value":"value"}
Run Code Online (Sandbox Code Playgroud)

响应:

{"Name":"ResultName:name","Value":"ResultValue:value"}
Run Code Online (Sandbox Code Playgroud)

JSONWebMessageBodyStyle.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)

XMLWebMessageBodyStyle.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)

XMLWebMessageBodyStyle.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.

  • 非常感谢您提供有用的明确解释.我给你一个投票. (2认同)