WCF REST消息格式(JSON/XML)选择

可以说WebHttpBinding和WebHttpBehavior是整个Web HTTP编程模型最为核心的两个类型,前者主要解决消息编码问题,而余下的工作基本上落在了终结点行为WebHttpBehavior上。WebHttpBehavior属性HelpEnabled和AutomaticFormatSelectionEnabled是"帮助页面"与"自动消息格式选择"这两个特性的总开关。

复制代码
public class WebHttpBehavior : IEndpointBehavior, ...
{
   //其他成员    
    public virtual bool HelpEnabled { get; set; }
     public virtual bool AutomaticFormatSelectionEnabled { get; set; }
}

WCF 4.0为REST服务提供了帮助页面功能,我们可以通过浏览器访问服务帮助页面的地址得到所有操作的基本信息。但是这个功能在默认的情况下是关闭的,我们需要通过应用在终结点上的WebHttpBehavior行为的HelpEnabled属性开启该功能。

复制代码
   1: <configuration>
   2:     <system.serviceModel>
   3:         <behaviors>
   4:             <endpointBehaviors>
   5:                <behavior>
   6:                    <webHttp helpEnabled="true" />
   7:                </behavior>
   8:             </endpointBehaviors>
   9:         </behaviors>
  10:         <services>
  11:             <service name="Artech.WcfServices.Service.EmployeesService">
  12:                 <endpoint address="http://127.0.0.1:3721/employees"
  13:                           binding="webHttpBinding" 
  14:                           contract="Artech.WcfServices.Service.Interface.IEmployees"/>
  15:             </service>
  16:         </services>
  17:     </system.serviceModel>
  18: </configuration>
二、 自动消息格式选择

REST服务具有两种基本的消息格式(Xml和Json)。在定义服务契约的时候,我们可以通过应用在操作方法上的WebGetAttribute和WebInvokeAttribute指定回复消息的格式。如果没有通过这种方式对消息格式进行显式设置,我们还可以通过终结点行为WebHttpBehavior为回复消息设置一个默认的消息格式。除了这种显示设置方式之外,WCF还提供一种自动消息格式选择机制。

所谓消息格式的自动选择,就是服务根据请求消息来选择一种适合的格式进行消息的序列化。在默认的情况下,这种自动选择机制是关闭的,我们需要通过WebHttpBehavior的AutomaticFormatSelectionEnabled属性开启该机制。具体的消息格式选择机制策略(顺序)如下:

  • 如果作为请求的HTTP消息具有Accept报头,则根据该报头决定回复消息的格式;
  • 如果作为请求的HTTP消息具有Content-Type报头,则根据该报头决定回复消息的格式;
  • 如果在定义服务契约时通过WebGetAttribute或者WebInvokeAttribute对回复消息的格式进行了显式设置,则采用该消息格式;
  • 如果通过终结点行为WebHttpBehavior设置了对回复消息的格式进行了显式设置,则采用该消息格式;
  • 采用默认消息格式Xml(WebMessageFormat枚举的默认值)。

我们同样通过之前创建的EmployeesService的实例来演示消息格式的自动选择机制。如下面的配置片断所示,我们将WebHttpBehavior行为应用到了寄宿服务的唯一终结点上,并且将AutomaticFormatSelectionEnabled属性设置为True。

复制代码
  1: <configuration>
   2:     <system.serviceModel>
   3:         <behaviors>
   4:             <endpointBehaviors>
   5:                 <behavior name="webHttp">
   6:                     <webHttp automaticFormatSelectionEnabled="true" />
   7:                 </behavior>
   8:             </endpointBehaviors>
   9:         </behaviors>
  10:     <services>
  11:         <service name="Artech.WcfServices.Service.EmployeesService">
  12:             <endpoint address="http://127.0.0.1:3721/employees" 
  13:                       behaviorConfiguration="webHttp"
  14:                       binding="webHttpBinding"  
  15:                       contract="Artech.WcfServices.Service.Interface.IEmployees"/>
  16:             </service>
  17:         </services>
  18:     </system.serviceModel>
  19: </configuration>
相关推荐
武子康4 分钟前
Java-210 Spring AMQP 整合 RabbitMQ:JavaConfig 注解配置、RabbitTemplate 发送/同步接收与坑位速查
xml·java·spring·消息队列·rabbitmq·java-rabbitmq·mq
jiayong2314 分钟前
`.flattened-pom.xml` 深度解析
xml
盼哥PyAI实验室21 分钟前
Python 爬虫核心基础:请求与响应机制全解析(从 GET 请求到 JSON 分页实战)
爬虫·python·json
小李飞飞砖1 小时前
RemoteViews的layout无法设置xml类型的Drawable,会报错
xml
武子康1 小时前
Java-209 Spring AMQP 整合 RabbitMQ 实战:XML 配置直连交换机、RabbitAdmin 自动声明与收发闭环
xml·java·spring·rabbitmq·java-rabbitmq·java-activemq
陌颜391110 小时前
JSON在线工具:从数据混沌到清晰洞察的智能助手
json
放学-别走15 小时前
免费在线 JSON 工具:格式化、校验、美化、压缩,一站式解决
json·json工具·json 格式化·json 校验·json 压缩·json 美化·json 转译
Data_agent15 小时前
京东图片搜索商品API,json数据返回
数据库·python·json
一方热衷.21 小时前
对图像分割的图片进行缩放的同时调整JSON标签
人工智能·计算机视觉·json
Filotimo_1 天前
在java开发中:JSON序列化和JSON反序列化
java·microsoft·json