首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

建立 OData 服務的新選擇:ASP.NET Web API OData

     編輯:關於.NET

兩種建立 OData 端點的方式

  • WCF Data Services:封裝 DbContext/ObjectContext,宣告式設定存取規則,自動處理查詢/更新,適合「以資料模型為中心、需快速公開 CRUD」場景。
  • ASP.NET Web API OData:由開發者撰寫 Controller 邏輯,控制每個 HTTP 動作回應,適合「需大量自訂行為、從 API 設計出發」場景。

Matt Milner 語錄:「WCF Data Services 適合從資料/模型出發直接公開;Web API 適合從 API 設計出發、決定要公開什麼。」

基礎 Web API 專案建立

  1. 新建 ASP.NET MVC 4 專案 → 選「空白」範本(非 Web API 範本)。
  2. 安裝 EntityFramework NuGet 套件(含 System.Data.Entity.dll)。
  3. 加入參考既有領域類別庫(含 AirlineContext、Airline、FlightLeg 等)。
  4. 右鍵 Controllers → 加入「具有讀寫動作的 Web API 控制器 (Entity Framework)」,產生 AirlineController。

產生的 Controller 繼承 ApiController,含 GetAirlines、GetAirline(id)、Put/Post/Delete 等動作,回傳 XML/JSON 視 Client Accept 標頭而定。

專案結構比較 加入控制器範本

轉為 OData 控制器:四步驟

  1. 繼承 EntitySetController<TEntity, TKey>(需安裝 Microsoft.AspNet.WebApi.OData NuGet)。
  2. 於 WebApiConfig.Register 以 ODataConventionModelBuilder 宣告 EntitySet。
  3. 設定 OData 路由 config.Routes.MapODataRoute。
  4. 將 Controller 類別命名為複數(如 AirlinesController)符合 OData 慣例。
public class AirlinesController : EntitySetController<Airline, int> {
    private AirlineContext db = new AirlineContext();
    [Queryable] // 啟用 $filter, $orderby 等
    public override IQueryable<Airline> Get() => db.Airlines;
    // 可選覆寫:GetEntityByKey, CreateEntity, UpdateEntity, PatchEntity, DeleteEntity, CreateLink, DeleteLink
}
public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Airline>("Airlines");
        builder.EntitySet<FlightLeg>("Legs");
        var model = builder.GetEdmModel();
        config.Routes.MapODataRoute("ODataRoute", "oairlinedata", model);
    }
}

測試 OData 端點

  • 服務文件:GET /oairlinedata/ → 列出 Airlines、Legs 集合。
  • 實體集:GET /oairlinedata/Airlines → JSON 陣列(含 odata.metadata)。
  • 單一實體:GET /oairlinedata/Airlines(3)。
  • 查詢選項(需 [Queryable]):$filter=startswith(Name,'Vermont')、$top、$orderby 等。

回傳範例:

{
  "odata.metadata":"https://localhost:1702/oairlinedata/$metadata#Airlines",
  "value":[
    {"Id":1,"Name":"Vermont Balloons","ModifiedDate":"2013-02-26T00:00:00"},
    {"Id":2,"Name":"Olympic Airways","ModifiedDate":"2013-02-26T00:00:00"},
    {"Id":3,"Name":"Salt Lake Flyer","ModifiedDate":"2013-02-26T00:00:00"}
  ]
}

進階主題與限制

  • PATCH:部分更新,邏輯需自行實作(通常先查詢現有實體再套用變更)。
  • 查詢限制:可透過 [Queryable(MaxTop=100)] 等屬性防止濫用。參考 OData 安全指南。
  • 關聯導航:CreateLink/DeleteLink 處理關聯。
  • 目前版本(ASP.NET and Web Tools 2012.2)僅支援 OData 子集,詳細支援清單請參閱版本說明。

學習資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved