WCF中的Web編程模型提供了一種以REST風格來設計Web Service的功能,它不同於以往基於SOAP或者WS-*規范的Web Service,而是以URI和http協議為中心的。對於操作的每一個資源有唯一的標志符,而利用不同的http動作(例如GET,POST,PUT,DELETE)來對這些資源進行相應的操作。同時該模型中還提供URI Template,它是用來定義參數化的URI,使URI的某些部分作為參數在服務中使用。可能這樣解釋十分含糊不清,下面用一個小例子來說明這種Web編程模型。
在該例子中,我們使用Northwind數據庫,.NET Framework 3.5,開發工具我使用的是VS2005.
首先我們實現一個簡單的需求,就是能夠獲取所有的Customers,這樣我們定義一個Customer的Service Contract,其中包括名為GetAllCustomers的Operation Contract。
[ServiceContract]
public interface ICustomerService
{
[OperationContract]
[WebGet(UriTemplate = "")]
List<Customer> GetAllCustomers();
}
可以看到,這是WCF中一個標准Service Contract的定義,其中的WebGet屬性可能是以前沒有見過的,它表示該服務是用Get動作來獲取數據,UriTemplate為空字符串表示它不匹配任何參數。
接下來我們實現這個Service,使之從數據庫中的Customer表讀取所有數據,這裡的Customer是一個Data Contract。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CustomerService : ICustomerService
{
public List<Customer> GetAllCustomers()
{
List<Customer> customerList = new List<Customer>();
//.........從數據庫中獲得所有的Customer
return customerList;
}
}
這樣,服務已經定義好並且有了實際的實現,以及我們應該用Get方法來訪問這個服務,最後,該服務需要被發布出來以讓外界訪問。
ICustomerService customerService = new CustomerService();
WebServiceHost customerServiceHost
= new WebServiceHost(customerService, new Uri("http://localhost:3333/"));
customerServiceHost.AddServiceEndpoint(typeof (ICustomerService), new WebHttpBinding(), "customers");
customerServiceHost.Open();
在浏覽器中敲入http://localhost:3333/customers,返回的是以xml格式來描述的所有customers。
如果我們想根據CustomerID來查詢某一個Customer,需要在Service Contract中增加一個Operation Contract。
[OperationContract]
[WebGet(UriTemplate = "{customerID}")]
Customer GetCustomer(string customerID);
這裡的customerID是參數,如果訪問的URI是http://localhost:3333/customers/ALFKI,那麼customerID匹配的就是ALFKI。
接下來便實現該Operation Contract,當我們在浏覽器中敲入http://localhost:3333/customers/ALFKI,返回的是xml格式描述的ALFKI這個Customer的信息。
本文主要介紹如何使用WCF的Web編程模型來開發REST風格的Web Service,在接下來的文章中會介紹更多的相關內容,比如復雜的UriTemplate、POST/PUT/DELETE的http動作等。