[VS2010] WCF 4.0 新功能:REST 服務開發
WCF 4.0 是一個新功能相當多的大改版,其新功能之一就是讓 WCF 應用程式更容易以 REST API 來呈現,在 WCF 3.5 中的 WebGetAttribute 與 WebInvokeAttribute 中的 UriTemplate 參數原本是不支援 REST URL 格式,為了 REST 功能,微軟還特別發布了一個 WCF REST Starter Kit 套件,讓開發人員可以利用 WCF 3.5 開發 REST-based 應用程式,其 URL 可以由開發人員自行設定,由 URL 對應到指定的 Service Contract 中的其中一個 Operation Contract,在 WCF 4.0 中,WCF 的核心已經融入了 REST Starter Kit 中的 URL 引擎,在 WebGetAttribute 與 WebInvokeAttribute 已經可以支援 REST 的功能,Windows Azure 許多服務的 REST API 就是利用 WCF 來開發的。
筆者在前文 Simple Configuration 的範例,就是一種 REST 範例,服務對外的 URL 是 http://localhost:8080/ProductQuery,而呼叫的方式是 http://localhost:8080/ProductQuery/[WCF Method],例如 http://localhost:8080/ProductQuery/LookupProducts,若方法中帶有參數,則要用 [WCF Method]?Parameter1=value1&Parameter2=value2&… 的方式來給定,但這樣又會違反 REST 使用 URL 設定資源路徑的規則,因此在 WCF 4.0 中,微軟將原本在 REST Starter Kit 組件中的 UriTemplate 整合進來,讓 Operation Contract 的方法可以由 URL 來指定,例如下列的程式碼:
[ServiceContract(Namespace = "http://sample.azure.com/appfabric/servicebus/productcontract")]
public interface IProductQuery
{
[OperationContract, WebGet]
List<ProductInfo> LookupProducts();
[OperationContract, WebGet(UriTemplate="Products/{ProductID}")]
ProductInfo LookupProduct(string ProductID);
}
[ServiceBehavior(Name = "ProductQuery", Namespace = "http://sample.azure.com/appfabric/servicebus/productqueryservice")]
public class ProductQuery : IProductQuery
{
public List<ProductInfo> LookupProducts()
{
List<ProductInfo> products = new List<ProductInfo>();
using (NorthwindEntities context = new NorthwindEntities())
{
var query = from q in context.Products
select q;
if (query.Count() > 0)
{
foreach (var item in query)
products.Add(new ProductInfo() { Name = item.ProductName, ProductID = item.ProductID });
}
}
return products;
}
public ProductInfo LookupProduct(string ProductID)
{
ProductInfo productInfo = new ProductInfo();
int productID = Convert.ToInt32(ProductID);
using (NorthwindEntities context = new NorthwindEntities())
{
var query = from q in context.Products
where q.ProductID == productID
select q;
if (query.Count() > 0)
{
productInfo.ProductID = query.First().ProductID;
productInfo.Name = query.First().ProductName;
}
}
return productInfo;
}
}
在紅字中的 WebGet(UriTemplate=”Products/{ProductID}”)] 即為設定讓 URL : http://localhost:8080/ProductQuery/Products/{ProductID} 這樣的 URL 可以呼叫 LookupProduct(ProductID) 這個方法,此程式的執行結果為:
UriTemplate 可以設定的 URL 格式非常多,像是下列的 URL 組法都可以支援:
"weather/WA/Seattle"
"weather/{state}/{city}"
"weather/*"
"weather/{state}/{city}?forecast=today
"weather/{state}/{city}?forecast={day}
如此彈性的 URL 樣式的設定,讓 WCF REST 服務具有相當高的彈性。
參考資料: