[VS2010] WCF 4.0 新功能 (2): REST 服務開發

[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) 這個方法,此程式的執行結果為:

image

image

 

UriTemplate 可以設定的 URL 格式非常多,像是下列的 URL 組法都可以支援:

  • "weather/WA/Seattle"

  • "weather/{state}/{city}"

  • "weather/*"

  • "weather/{state}/{city}?forecast=today

  • "weather/{state}/{city}?forecast={day}

 

如此彈性的 URL 樣式的設定,讓 WCF REST 服務具有相當高的彈性。

參考資料:

UriTemplate Class

What’s new in Windows Communication Foundation 4.0