Asp.Net Web API 2第十七課——Creating an OData Endpoint in ASP.NET Web API 2(OData終結點)...

weixin_34377065發表於2014-03-18
原文:Asp.Net Web API 2第十七課——Creating an OData Endpoint in ASP.NET Web API 2(OData終結點)

前言

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

相關文章