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

Data 2.0:ADO.NET Data Services (Astoria) 公開與消費資料服務完整架構指南

     編輯:關於.NET

ADO.NET Data Services (代號 Astoria) 旨在為資料導向服務提供基於 REST 的統一框架,讓企業內部網或網際網路的所有 Web 用戶端能以統一介面存取資料。框架包含伺服器端庫 (安全公開資料) 與多種用戶端庫 (.NET、Silverlight、AJAX),支援豐富互動網頁應用 (RIA) 與資料混合應用。

核心架構

ADO.NET Data Services 架構

  • 資料模型:採用實體資料模型 (EDM) / CSDL 定義實體、關聯、實體集
  • 通訊協定:REST 風格 HTTP + AtomPub/JSON 格式
  • 查詢語法:統一 URI 格式支援篩選、排序、分頁、展開關聯
  • 安全性:整合 ASP.NET/WCF 驗證,實體集層級存取規則、查詢/變更攔截器

使用 EDM 描述資料

實體 = 含鍵值的結構化記錄 (如 Customer、Order)。實體集 = 實體集合 (Customers)。關聯 = 實體類型間連結 (Employee WorksFor Department)。EDM 完美對應 Web 資源與連結概念。

優勢:單一資料模型服務多種應用 (報表、入口網站、工作流),並與 ADO.NET Entity Framework 共享模型定義。

關聯式資料來源:Entity Framework 整合

  1. 專案加入 ADO.NET Entity Data Model (從資料庫產生)
  2. 加入 ADO.NET Data Service 項目
  3. 修改服務類別繼承 DataService<NorthwindEntities>
  4. 設定存取規則:
public class NorthwindService : DataService<NorthwindEntities> {
    public static void InitializeService(IDataServiceConfiguration config) {
        config.SetEntitySetAccessRule("*", EntitySetRights.All); // 開放所有
    }
}

瀏覽器訪問 /NorthwindService.svc 即可看到 Atom 格式的實體集清單。

非關聯式資料來源:自訂 CLR 物件 (IQueryable)

實作 IQueryable<T> 屬性公開記憶體內集合:

public class User { public int ID {get;set;} public string Name {get;set;} 
    public IList<Contact> Contacts {get;set;} }
public class Contact { public int ID {get;set;} public string Name {get;set;} 
    public string Email {get;set;} }

public class MyDataService {
    static User[] _users; static Contact[] _contacts;
    static MyDataService() { /* 初始化測試資料 */ }
    public IQueryable<User> Users => _users.AsQueryable();
    public IQueryable<Contact> Contacts => _contacts.AsQueryable();
}

// 服務掛載
public class ContactsService : DataService<MyDataService> {
    public static void InitializeService(IDataServiceConfiguration config) {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
    }
}

生產環境中 IQueryable 提供者會將運算式樹轉換為資料來源原生查詢 (如 LINQ to Entities → SQL)。

統一 URI 格式與查詢選項

https://host/vdir/service.svc/EntitySet[(Key)][/NavigationProperty[(Key)]...]

範例 (Northwind):

  • /Customers — 所有客戶
  • /Customers('ALFKI') — 單一客戶
  • /Customers('ALFKI')/Orders — 該客戶訂單 (導覽屬性)

查詢字串參數:

  • $filter=City eq 'London' — 篩選
  • $expand=Orders — 主動載入關聯
  • $orderby=City asc — 排序
  • $skip=10&$top=20 — 分頁

資料服務安全性機制

  1. 驗證:沿用 ASP.NET/WCF 基礎設施,自動建立請求主體身分
  2. 預設完全鎖定:需明確設定 SetEntitySetAccessRule
  3. 實體集層級權限:
config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
config.SetEntitySetAccessRule("Orders", EntitySetRights.ReadSingle); // 單筆讀取
config.SetEntitySetAccessRule("Products", EntitySetRights.WriteInsert | EntitySetRights.WriteUpdate); // 不可刪除
  1. 查詢攔截器:動態加入篩選條件 (如僅能查詢自己的訂單)
[QueryInterceptor("Orders")]
public Expression<Func<Orders,bool>> OnQueryOrders() 
    => o => o.Customer.ContactName == HttpContext.Current.User.Identity.Name;
  1. 變更攔截器:驗證/修改插入更新刪除操作,拋出例外可中止操作

用戶端庫:三大平台支援

.NET / Silverlight 用戶端

  • 核心類別:DataServiceContext (執行階段上下文、身分解析、開放式並行)、DataServiceQuery<T> (URI 查詢表示)
  • 實體類別來源:手寫、「加入服務參考」精靈 (最常用)、datasvcutil.exe 命令列工具
  • LINQ 查詢支援:from c in ctx.Customers where c.City=="London" orderby c.CompanyName select c (自動轉譯為 URI)
  • 關聯載入:context.LoadProperty(entity, "NavigationProperty") 延遲載入,或 URI $expand 主動載入

CRUD 操作對應 HTTP 動詞

操作HTTP 動詞用戶端 API
CreatePOSTcontext.AddObject("EntitySet", entity); context.SetLink(...); context.SaveChanges();
UpdatePUTcontext.AttachTo(...); context.UpdateObject(entity); context.SaveChanges();
DeleteDELETEcontext.AttachTo(...); context.DeleteObject(entity); context.SaveChanges();

SaveChanges() 批次提交所有掛起變更。支援 SaveChangesOptions.Batch 單一 HTTP 請求原子提交,或 ExecuteBatch 合併多查詢。

Silverlight 用戶端差異

  • 隨 Silverlight 2 SDK 提供,非 Data Services 套件一部分
  • 僅支援非同步 API (Begin/End 模式),同步方法不可用

AJAX 用戶端

  • 從 CodePlex 取得 ASP.NET AJAX Library
  • 直接操作 JavaScript 物件,庫處理 HTTP/AtomPub 細節

總結

ADO.NET Data Services 提供標準化、可擴充的資料服務平台:REST/AtomPub 介面確保跨平台互通,EDM 模型統一語義,豐富用戶端庫降低開發門檻,安全機制滿足企業級需求。適用於 RIA 資料層、公開 API、資料混合應用等多種場景。

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