前言
很久沒更新博客了,加上剛過年,現在准備重新開戰,繼續自己的學習之路。本文已同步到Web API2系列文章中http://www.cnblogs.com/aehyok/p/3446289.html。
示例項目下載地址http://pan.baidu.com/s/1sjEWVPN
開放數據協議(OData)是Web數據訪問協議。OData提供了一種統一的方式來組織數據,查詢數據,並通過操縱CRUD操作的數據集(創建,讀取,更新和刪除)。
OData同時支持AtomPub(XML)和JSON格式。OData的還定義了一個方法來公開元數據有關的數據。客戶端可以使用元數據來發現類型信息和關系的數據集。ASP.NET Web API OData可以很容易的創建OData終結點的數據集。您可以控制哪些操作的OData終結點支持。你可以托管多個的OData終結點,沿着非OData終結點。你可以完全的控制你的數據模型,后台業務邏輯和數據層。
在本教程中,您將創建一個簡單的可供客戶端可以查詢的OData終結點。您還可以創建一個C#客戶端的終結點。本教程使用的Visual Studio2013。
創建 Visual Studio 項目
在本教程中,您將創建支持基本的 CRUD 操作的OData 終結點。該終結點將公開一個單一的資源,一個產品的列表。以后的教程中將會添加更多的功能。
選擇合適的模版進行創建項目
並命名為OData,點擊確認后,在下一個Asp.Net 項目對話框中選擇 Empty的空模版,並在以下對象添加文件夾和核心引用下:進行勾選Web API。
添加一個實體模型
一個model就是在應用程序中展現數據的一個對象。在本教程中,我們需要一個展現產品的模型。這個模型對應着我們的OData的實體類型。
在解決方案資源管理器中,右鍵單擊Models文件夾。從上下文菜單中,選擇添加然后選擇類。
添加相應的文件,並命名為Product。
在Product.cs文件中,添加如下類定義:
public class Product { public int ID { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Category { get; set; } }
ID屬性為實體鍵。客戶端可以通過ID來查詢產品。此字段也是后台數據庫中表的主鍵,之后進行生成項目的步驟。
添加一個OData的控制器
控制器就是一個處理HTTP請求的類。在OData服務中你為每個實體數據集定義一個獨立的控制器。在本教程中我們將創建一個單一的控制器。
在解決方案資源管理器中,右鍵單擊控制器文件夾。選擇添加,然后選擇控制器.
在添加支架的對話框中,選擇一個OData的模版,如下圖所示。
在添加控制器對話框中,命名控制器名稱為ProductsController。選擇“使用異步控制器操作”。在模型類下拉菜單中選擇Product。
然后點擊上面的“新建數據上下文”
並命名為ProductServiceContext。
然后將可以看到會在項目中添加兩個文件:
添加EDM和Route
在解決方案資源管理器中,打開App_Start文件夾,然后找到WebApiConfig.cs文件並打開。用下面的代碼進行替換之前默認的配置代碼。
public static void Register(HttpConfiguration config) { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Product>("Products"); config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel()); }
這個代碼處理了兩個問題:
1、為OData終結點創建一個數據實體模型(EDM)。
2、為OData終結點添加一個路由。
EDM是一個抽象的數據模型。EDM用於創建元數據文件和定義服務的URIs.ODataConventionModelBuilder 通過使用一組默認的EDM命名約定來創建 EDM。這種方法需要最少的代碼。如果你想更多的來控制EDM,使用ODataModelBuilder類明確的添加屬性、鍵、導航屬性來創建EDM。
這個EntitySet 方法就是將一個實體添加到EDM實體中。
modelBuilder.EntitySet<Product>("Products");
字符串Products定義的是這個實體集的名稱。控制器的名稱必須匹配實體集的名稱。在這個教程中,這個實體集的名稱被命名為”Products“,這個控制器被命名為ProductsController。如果你命名這個實體集為”ProductSet“,那么你將需要把控制器命名為”ProductSetController“。請注意一個終結點可以包含多個實體集。為每個實體集調用EntitySet<T>,然后定義一個合適的控制器。
MapODataRoute 方法為OData終結點添加一個路由。
config.Routes.MapODataRoute("ODataRoute", "odata", model);
第一個參數是一個路由的名稱。你的服務的客戶端看不到這個名稱的。第二個參數是終結點URL的前綴。鑒於這些代碼,針對產品實體集的URL是http://hostname/odata/Products。你的應用程序可能會有超過一個的OData終結點。對於每一個終結點,調用MapODataRoute 方法,提供一個唯一的路由名稱和一個唯一的URL前綴。
Seed the Database (可選的)
在這一步驟中,您將使用EF框架來插入數據庫中一些測試數據。這一步是可選的,但是它能讓你立刻測試出OData終結點。
從工具菜單中找到如下
並鍵入如下命名:
Enable-Migrations
這將添加一個Migrations 的文件夾,並有一個Configuration.cs的文件
打開Configuration.cs,在Seed方法中添加如下的代碼:
protected override void Seed(OData.Models.ProductServiceContext context) { context.Products.AddOrUpdate(new Product[] { new Product() { ID = 1, Name = "Hat", Price = 15, Category = "Apparel" }, new Product() { ID = 2, Name = "Socks", Price = 5, Category = "Apparel" }, new Product() { ID = 3, Name = "Scarf", Price = 12, Category = "Apparel" }, new Product() { ID = 4, Name = "Yo-yo", Price = 4.95M, Category = "Toys" }, new Product() { ID = 5, Name = "Puzzle", Price = 8, Category = "Toys" }, }); }
然后再在軟件包管理器控制台窗口,輸入以下命令,並順序執行兩個命令:
Add-Migration Initial
Update-Database
測試OData終結點
在這一部分,我們將使用 Fiddler Web Debugging 來發送請求到終結點來檢測響應消息。這將幫助您去理解OData終結點的功能。
在Visual Studio中,按F5進行運行程序。
1、然后在Fiddler中http://localhost:3629/Odata/Products,獲得產品列表
點擊執行
2、為了得到元數據文件,可以發送請求如下http://localhost:3629/odata/$metadata,直接通過瀏覽器
3、為了通過ID來獲取某一個實體http://localhost:3629/Odata/Products(1)
4、可以發現默認得到的數據格式是JSON格式的,下面我們來設置一個xml格式的。
得到如下數據
5、再換一個數據格式application/json;odata=verbose
.
得到數據如下
總結
這是執行程序調用上下文之后產生的數據庫文件。直接生成在項目中,進行添加即可。
示例項目下載地址http://pan.baidu.com/s/1sjEWVPN
本文參考地址http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/creating-an-odata-endpoint