OData 這東西其實很久了,只是隨著時間過去 , Web API 搭配 OData 的開發方式 也有些不同了。
特此筆記一下 。
開發環境:
- Visual Studio 2015 with Update 3
- .Net Framework 4.5
開發步驟:
- 新增一個ASP.NET Web Application 專案
- 選擇 空白範本並勾選 Web API
- 在Models資料夾利用Code First 的方式新增NorthWindModel 及 Products
- 在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; } } }
- 如果沒有加註 Key Attribute 則會發生錯誤
- 利用Nuget 安裝 Microsoft.AspNet.OData
- 在Controllers 資料夾 新增一個Product Controller
- 加入一個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; } } }
- 如果沒有加註 EnableQuery Attribute ,則OData 的指令會沒有作用
- 修改App_Start下的WebApiConfig.cs,加入以下的程式碼
var oDataBuilder = new ODataConventionModelBuilder(); oDataBuilder.EntityType<Products>().HasKey(x => x.ProductID); config.MapODataServiceRoute("ODataRoute", null, oDataBuilder.GetEdmModel());
- 如果要預設以JSON輸出,修改App_Start下的WebApiConfig.cs,加入以下的程式碼
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
- 利用 /$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