[VS2010] WCF 4.0 新功能 (3): 由 REST 服務中傳回自訂的格式
在前一回的 REST API 服務實作中,我們已經可以傳回一組 XML 的資料給用戶端,但是有時候我們要的不是 XML,有可能是一般文字 (plain text),RSS feed 資料或是 JSON 格式的資料,那這時候要怎麼做呢?我們可以利用 System.ServiceModel.Channel 的 Message 類別,在 REST 服務的方法中,傳回 Message 物件,例如下列的服務合約:
[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);
[OperationContract, WebInvoke(Method = "POST", UriTemplate = "Products/Post", BodyStyle = WebMessageBodyStyle.Bare)]
string HandlePostData(Stream input);
[OperationContract, WebGet(UriTemplate = "CustomFormatProducts")]
Message LookupProductsWithCustomFormat();
}
在 LookupProductsWithCustomFormat() 函式中,我們傳回一個 Message 物件,這個物件在 WCF 輸出時會建立不同的 Message 格式,而服務要利用 WebOperationContext 物件的幾個方法來生成它,包含幾個內建的訊息:
- WebOperationContext.CreateJsonResponse() : 生成 JSON 訊息。
- WebOperationContext.CreateAtom10Response() : 生成 ATOM 1.0 的 Feed 格式。
- WebOperationContext.CreateTextResponse() : 生成文字格式訊息。
- WebOperationContext.CreateStreamResponse() : 生成訊息資料流格式訊息。
- WebOperationContext.CreateXmlResponse() : 生成 XML 訊息格式,這是預設的訊息格式。
例如下列的方法實作,會傳回 JSON 的訊息:
public Message LookupProductsWithCustomFormat()
{
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 });
}
}
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";
Message resultMessage = WebOperationContext.Current.CreateJsonResponse<List<ProductInfo>>(products);
return resultMessage;
}
這個方法會輸出下列訊息:
[{"Name":"Chai","ProductID":1},{"Name":"Chang","ProductID":2},{"Name":"Aniseed Syrup","ProductID":3},{"Name":"Chef Anton's Cajun Seasoning","ProductID":4},{"Name":"Chef Anton's Gumbo Mix","ProductID":5} … ]
參考資料: