服务可以使用WebHttpBinding以及WebGet或者WebInvoke属性来暴露。这些属性每一个都确定HTTP动作、消息格式以及需要暴露给一个操作的消息体形式。我们将检查这些属性的每一个并给出使用每个的原因。
WebGet
WebGet属性使用GET动词暴露操作。GET相对于其他HTTP动作有重要的优势。首先,通过在一个浏览器地址栏中输入服务URI可以直接地访问终结点。参数可以作为查询字符串或者编码字符串在URI中发送。其次,客户端以及其他下游系统比如代理服务器可以很容易地基于缓存策略来为服务缓存资源。由于缓存能力,WebGet属性应该只用来做收集用。
列表13.6 显示了使用WebGet和WebInvoke属性定义的一个服务。WebGet属性用来收集客户信息。WebInvoke属性被用于那些修改数据的添加或者删除客户信息的操作。最后,在WebGet和WebInvoke属性上定义UriTemplate属性来使用URI定义一个自定义资源。
列表13.6 CustomerService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web;
namespace EssentialWCF
{
[ServiceContract]
public class CustomerService
{
[OperationContract]
[WebGet(UriTemplate = "/customer/{id}")]
public Customer GetCustomer(int id)
{
Customer customer = null;
//Get customer from database
return customer;
}
[OperationContract]
[WebInvoke(Method="PUT", UriTemplate="/customer/{id}")]
public void PutCustomer(int id, Customer customer)
{
//Put customer in database
}
[OperationContract]
[WebInvoke(Method="Delete", UriTemplate="/customer/{id}")]
public void DeleteCustomer(int id)
{
//Put customer in database
}
}
}