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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM