前言
很久沒更新部落格了,加上剛過年,現在準備重新開戰,繼續自己的學習之路。本文已同步到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