WEP API 搭配 OData

  • 392
  • 0
  • 2016-07-11

OData 這東西其實很久了,只是隨著時間過去 , Web API 搭配 OData 的開發方式 也有些不同了。
特此筆記一下 。

 

          開發環境:

  • Visual Studio 2015 with Update 3
  • .Net Framework 4.5

          開發步驟:

  1. 新增一個ASP.NET Web Application 專案
  2. 選擇 空白範本並勾選 Web API
  3. 在Models資料夾利用Code First 的方式新增NorthWindModel 及 Products
  4. 在Products 的屬性 ProductID 加註 Key Attribute
    namespace WebApplication1.Model
    {
        
        using System.ComponentModel.DataAnnotations;
        using System.ComponentModel.DataAnnotations.Schema;
    
    
        public partial class Products
        {
            [Key]
            public int ProductID { get; set; }
    
            [Required]
            [StringLength(40)]
            public string ProductName { get; set; }
    
            public int? SupplierID { get; set; }
    
            public int? CategoryID { get; set; }
    
            [StringLength(20)]
            public string QuantityPerUnit { get; set; }
    
            [Column(TypeName = "money")]
            public decimal? UnitPrice { get; set; }
    
            public short? UnitsInStock { get; set; }
    
            public short? UnitsOnOrder { get; set; }
    
            public short? ReorderLevel { get; set; }
    
            public bool Discontinued { get; set; }
        }
    }
    
  5. 如果沒有加註 Key Attribute 則會發生錯誤
  6. 利用Nuget 安裝 Microsoft.AspNet.OData
  7. 在Controllers 資料夾 新增一個Product Controller
  8. 加入一個GetAllProducts的函數並加註EnableQuery Attribute
    using System.Linq;
    using System.Web.Http;
    using System.Web.OData;
    using WebApplication1.Model;
    
    namespace WebApplication1.Controllers
    {
        public class ProductController : ApiController
        {
            [EnableQuery]
            public IQueryable<Products> GetAllProduct()
            {
                return new NorthWindModel().Products;
            }
        }
    }
    
  9. 如果沒有加註 EnableQuery Attribute ,則OData 的指令會沒有作用
  10. 修改App_Start下的WebApiConfig.cs,加入以下的程式碼
     
    var oDataBuilder = new ODataConventionModelBuilder();
    oDataBuilder.EntityType<Products>().HasKey(x => x.ProductID);
    config.MapODataServiceRoute("ODataRoute", null, oDataBuilder.GetEdmModel());
  11. 如果要預設以JSON輸出,修改App_Start下的WebApiConfig.cs,加入以下的程式碼
     
    var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
    config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    如果要強制使用JSON輸出則將上面兩行程式碼改為以下的程式碼
     
    config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
  12. 利用 /$metada 取得實體物件模組型的定義


          參考資料:

  • http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api
  • https://dotblogs.com.tw/joysdw12/archive/2013/06/07/web-api-odata.aspx
  • http://huan-lin.blogspot.com/2013/01/aspnet-web-api-and-json.html
  • http://blog.miniasp.com/post/2012/10/12/ASPNET-Web-API-Force-return-JSON-format-instead-of-XML-for-Google-Chrome-Firefox-Safari.aspx