本文章是由機器翻譯。

實際 OData

使用 Open Data Protocol

Shayne Burgess

在 PDC09 Microsoft WCF 資料服務小組 (之前稱為 ADO.NET 資料服務小組) 先 unveiled OData,開啟的資料通訊協定。通知中的會議,在第二天的 keynote 但是,wasn’t OData 開始的位置。熟悉 ADO.NET 資料服務的人有 OData 使用與資料傳輸通訊協定的資源為基礎的應用程式,因為 ADO.NET 資料服務變得可用在 Microsoft.NET Framework 3.5 SP1。這個本文我解釋如何豐富的網際網路應用程式 (RIAs) 的開發人員可以使用 OData,而且我也顯示這樣做的好處。

我先回答,[否]。1 OData unveiling 在 11 月後被詢問的問題:它是什麼?非常簡單的用語 OData 是資源為基礎 Web 通訊協定查詢和更新資料。OData 定義資源使用 HTTP 動詞 (PUT、 POST、 更新和刪除) 上的作業,它會識別使用標準的 URI 語法的那些資源。透過使用 AtomPub 或 JSON 標準 HTTP 傳輸資料。AtomPub,OData 通訊協定會定義某些慣例,以支援查詢和結構描述資訊的交換標準上。如需詳細資訊的 odata.org 瀏覽 OData。

OData 系統

這個本文中,我介紹幾個產品、 架構和取用,或產生 OData 餵送的 Web 服務。通訊協定定義資源可以操作的方法和 (GET,PUT,POST、 MERGE 和 DELETE,讀取、 建立、 取代、 合併及刪除對應) 的作業可以在這些資源上執行。

實際上,這表示會消耗 OData 通訊協定的用戶端可以在任何製作者上操作。’s 不需要學習程式設計模型的程式,對服務的服務 ; ’s 只需選擇目標語言中的程式。

如果,就例如您 ’re Silverlight 開發人員學習 OData 媒體櫃,該平台,您可以對任何 OData 送紙進行程式設計。超過 OData 程式庫,Silverlight 的您 Microsoft.NET Framework 戶端,AJAX,Java、 PHP 和目標-C,具有多個方法找出文件庫。而且,Excel 的 Microsoft PowerPivot 支援餵送到其記憶體中分析引擎的資料匯入的選項的其中一個 OData。

而且如同用戶端能夠使用 OData 通訊協定可以透過製作者的任何操作,服務或應用程式使用 OData 建立可由任何 OData 啟用用戶端。建立 Web 服務公開為 OData 端點的關聯式資料 (或公開在 SharePoint 網站中的資料、 在 Windows Azure 或您有何資料表) 之後,您可以輕鬆地建置豐富的桌面用戶端在.NET Framework 或豐富 AJAX 架構網站使用相同的資料。

OData 的長期目標,就是讓每個主要技術,讓每個用戶端應用程式可以使用 OData 餵送許多程式設計語言與平台的 OData 用戶端程式庫。結合,產生者和消費者的 OData 建立一個 OData 「 生態系統 」。

什麼 ’s 新功能 WCF 資料服務?

WCF 資料服務的.NET] 架構的元件是可提供周全的解決方案,來建立 OData Web 服務的架構,並包含與您可以建置耗用 OData 餵送的用戶端的用戶端程式庫。WCF 資料服務小組最近發行的.NET Framework 3.5 SP1 所引進的新功能,您也.NET Framework 4 中找到的主機更新。這是資料服務架構的第二個的版本。請造訪 blogs.msdn.com/astoriateam/archive/2010/01/27/data-services-update-for-net-3-5-sp1-available-for-download.aspx ,位置您尋找說明和連結下載。

WCF 資料服務架構不只是針對 RIA 應用程式通訊協定。它也針對高比例服務開發人員所設計,並有許多功能給他們,該訴求範圍,例如伺服器的分頁限制 HTTP 快取無狀態的服務的支援資料流支援] 及 [隨插即用提供者模型。let’s 查看 RIA 開發人員最感興趣的通常是新的功能。

其中一個最上層的功能希望客戶表示之後最初發行的版本是能夠要求集合中的項目數目。新的 「 計數 」 功能可以解決這項需求與兩個部分。它首先,可讓您要求只計數 — 也就是查詢會傳回的值數目。第二個,它加入告知時查詢結果是設定 (例如,在啟用伺服器分頁) 的部分,包含實體總數的計數中一組服務的查詢選項。

若要加強經驗,當資料繫結從 OData 服務,新類型 DataServiceCollection,已加入 WCF 資料服務用戶端程式庫。它會實作變更追蹤它 (透過使用的 INotifyPropertyChanged 和 INotifyCollectionChanged] 介面中) 中包含的項目。當它繫結至控制項 — 例如的 Silverlight 中的 DataGrid — 它會追蹤這些物件和集合本身所做的變更。這個新的集合,可以大幅簡化建立 OData 用戶端與介面元件的程序。

另一種經常要求的功能是能夠專案在查詢結果中傳回的實體屬性的子集。已新增 LINQ 支援此,透過選取 LINQ 陳述式。這有兩個優點:它可減少大小的 HTTP 回應的查詢,和它可減少記憶體耗用量的用戶端物件。您開發對您 don’t 擁有,且每個實體可能有許多屬性,用戶端不感興趣的是服務的用戶端應用程式時,這可能會特別有用。這個本文稍後我示範使用大型、 公開提供使用的服務,在各個實體上有許多項目,具有許多屬性。預測會有用的範例中,因為它包含只有幾個必要的屬性上一個實體。

若要可協助您瞭解 OData 生態系統的值,我們建立 Web 應用程式,可讓瀏覽我的虛構房地產的站台訪客公司 Contoso] 上面,查看它所管理的屬性清單。

關聯式資料

家用 Contoso.com 搜尋應用程式的主要資料來源是包含它已發行的這些屬性有關的所有屬性在管理該公司及所有目前與先前售出的清單資訊的 SQL Server 資料庫。

WCF 資料服務和 ADO.NET Entity Framework,在.NET Framework 3.5 SP1 發行,以來已經輕易地公開 (Expose) 為餵送的 OData 關聯式資料庫。所有需要的是一個 Entity Framework 關聯式資料建立模型。OData 摘要是 HTTP 架構讓您需要裝載服務的網站或 Web 服務。

若要建立關聯式資料餵送的 OData,第一步是建立 ASP.NET Web 應用程式中裝載 OData 服務的 Visual Studio 2010。在 [Visual 的 Studio 選取 [檔案 | 新增 | 專案 | ASP.NET Web 應用程式。這會建立可以用來裝載餵送的 OData 的 Web 服務的基本架構。

建立 Web 服務並將其設定之後,我們建立 OData 摘要會公開 (Expose) Entity Framework 資料模型。Visual Studio 會讓這個簡單使用可讓您從現有的資料庫模型自動產生的 [加入新項目] 精靈。圖 1 顯示包含屬性和清單由 Contoso 的 SQL Server 資料透過使用 [加入新項目] 精靈建立一個簡單的資料模型。


圖 1 的 關聯式資料的實體架構資料模型

現在 let’s 建立 WCF 的資料服務公開此資料模型,為 OData 摘要。Visual Studio 也使得這簡單與 WCF 資料服務選項在 [加入新項目] 精靈。選取這個選項之後 Visual Studio 提供的程式碼檔案 (在這個範例中,檔案稱為 「 Listings.svc.cs 」) 的用來設定資料服務。

圖 2 中的程式碼將示範如何定義 WCF 資料服務。清單類別是公開資料] 服務的服務類別,而且它會實作泛型 DataService <T>。用來定義 DataService <T> 的 圖 2 中的型別是 ListingsEntities 型別是建立在 的 圖 1 的 Entity Framework 內容。這個類別會接受 Entity Framework 內容,所以這是快速且容易的方法,以讓 WCF 的資料服務公開關聯式資料最新的而且正在執行。DataService 類別 isn’t 限制只使用透過 Entity Framework 內容,不過 ; 
the 類別會接受任何實作 IQueryable 介面 CLR 物件的集合。在 [.NET] Framework 4 WCF 資料服務的新自訂提供者模型已經建立幾乎任何資料來源上的服務可以讓新增。

圖 2 定義 WCF 資料服務

// The ListingsEntities is the Entity Framework Context that the Service exposes
public class Listings : DataService< ListingsEntities >
{
  public static void InitializeService(DataServiceConfiguration config)
  {
    // These lines set the access rights to "Read Only" for both entity sets
    config.SetEntitySetAccessRule("Listings", EntitySetRights.AllRead);
    config.SetEntitySetAccessRule("Properties", EntitySetRights.AllRead);

    // There are currently no service operations in the service
    config.SetServiceOperationAccessRule("MyServiceOperation",
      ServiceOperationRights.All);

    config.DataServiceBehavior.MaxProtocolVersion = 
      DataServiceProtocolVersion.V2;
  }
}

let’s 看起來有點接近在 InitalizeService 方法,在 的 圖 2 正在做什麼。該方法會呼叫這兩個服務會公開 (Expose) 的實體集的 [SetEntitySetAccessRule,並設定 AllRead 存取權限。這會告訴要使這兩個實體集的完整可讀取,但是不允許任何的插入、 更新或刪除服務。這是很好的方法,來控制服務的存取。WCF 資料服務也支援稱為查詢攔截器,可讓服務作者,以設定每個實體集為基礎的服務的更精密的存取控制項的方法。將 Listings.svc 檔案設定為專案的起始頁,並執行專案。瀏覽器視窗會開啟,並顯示服務] 文 的 圖 3 所示。


圖 3 的 SharePoint 網站的服務文件

OData URI 慣例

服務文件列出服務所公開的實體集。請記住您可以存取在此服務使用功能強大的 URI 語法定義為 OData 通訊協定的選擇性部分資源。let’s 採取看這項服務 URI 的語法。若要存取每個實體集的摘要,新增至服務的基底 URI 設定實體的名稱 ; http://myhost/Listings.svc/Properties 會,就例如地址內容實體集合中的項目集合。

’s 也可能解決使用其索引鍵的值,個別的特定實體 ; URI http://myhost/ Listings.svc/Properties(0) 會處理識別碼屬性 = 0。您可以從這個實體位址關聯性,以另一個實體或一組實體,藉由附加到的 URI 是 http://myhost/ Listings.svc/Properties (0) 結尾的關聯性的名稱 / 清單會存取的識別碼屬性實體相關聯的清單組 = 0。使用 [此語法 ’s 可能瀏覽許多層級的關聯性。

URI 語法也定義了許多查詢的選項可以附加至 URI,以修改某些方式基底的查詢,以及每個查詢選項定義為名稱/值組。就例如藉由附加查詢選項 $ 頂端 = 10,您限制只有前 10 個的記錄結果的查詢。圖 4 列出所有查詢的 URI 語法中的可用選項。

圖 4 的 OData 查詢選項

$ 頂端 = n 限制查詢只第一個 n 個項目。
$ 略過 = n 略過在集合中第一個 n 的實體。
$ inlinecount = allpages 在結果中包含的所有實體集的計數。
$ 篩選 = <expression> 運算式可以提供來限制查詢所傳回的結果 (範例:$ 篩選 = 狀態 eq ‘ 可用 ’ 會有與值 「 可用的 」 的 Status 屬性的實體限制結果)。
$ orderby = <expression> 排序結果的一組實體的屬性
$ 選取 = <expression> 指定要傳回實體的屬性的子集。
$ 格式 指定要傳回 (ATOM 或 JSON) 摘要格式。在 WCF 資料服務中不支援此選項。

公開 (Expose) 從 SharePoint 的資料

在前一節中我示範您如何將資料儲存在關聯式資料庫、 屬性和不動產 Web 站台的清單資訊公開 (Expose)。let’s 說我也有實際空間代理程式人員銷售的屬性的相關資訊,但在 SharePoint 網站中儲存資料。Microsoft SharePoint 2010 有能力來公開為 OData 摘要的所有清單和這些清單內的文件。這是適合房地產網站,因為它表示公司員工所輸入的代理程式資訊是可用的因為一個 OData 符號,可納入我建置的清單應用程式。有使用 SharePoint 介面來輸入並更新此資料的處理程序的使用者 don’t 必須變更他們的工作流程,以符合我的應用程式。使用即時所建立的清單應用程式中輸入公司的 SharePoint 網站的資料。

圖 5 顯示簡單的 SharePoint 入口網站至記錄,並更新其連絡資訊的房地產代理程式使用。


圖 5 的 代理程式資訊的 SharePoint 網站

ADO.NET 資料服務更新,.NET Framework 3.5 SP1 安裝 SharePoint 系統上,[新的 HTTP 端點] 會變成可用公開清單資料餵送的 OData 為每個站台。因為使用 HTTP 存取 OData 摘要,可以使用只是 Internet Explorer 來進行檢查。圖 6 顯示在 SharePoint 中的代理程式清單的摘要。


圖 6 代理程式送紙 SharePoint 代理程式服務從

從 OGDI 耗用的參考資料

預設情況下,OData 摘要會傳回的餵送的 ATOM 表示],然後從 Web 瀏覽器存取時結果就會是一個 ATOM 摘要]。如果要求的 [接受] 標題變更為 「 應用程式/json 」,結果就會是與餵送的 JSON 相同的資料。

圖 6 中摘要開頭 <feed> 項目,表示一組的實體。包含在每個摘要是一組 <entry> 的項目每一個都代表摘要中的單一項目 (第三個項目的項目會摺疊,讓整個餵送一個畫面中的 [看得見)。

在此的範例實體上它定義的並行存取語彙基元,摘要中的每個實體的結果上有 etag 屬性。etag 是語彙基元,用資料服務所要求的實體有變更時,強制執行並行核取。使用一個 <entry>] 標記格式化的每個實體是由包含要用來編輯實體和實體 ’s 關聯性連結的連結的一組所組成。每個關聯性連結指向另一個實體,或是一組實體 (這些稱為參考] 和 [瀏覽] 屬性分別)。每個 <entry> 項目也 
includes <m:properties> 項目包含實體的基本和複雜型別屬性 ; 屬性值組成的實體上屬性名稱和該屬性的值。

開啟政府資料碼計劃 (OGDI) 是方便政府機構發行各種不同的公用資料在 Microsoft Windows Azure 平台上建置的服務。OGDI 專案提供入門套件可以使用的政府機構,以公開其資料。就例如 Edmonton 城市的已採用入門套件,以公開它的政府資料和服務,以在 ogdisdk.cloudapp.net 有關華盛頓,D.C.區域有與各種資料的資料集。另一個例子是 Microsoft Codename 「 達拉斯 」 專案的目標是要讓它簡單的資料集,以將資料公開為 Web 服務的任何人。此專案也 Windows Azure 平台上建置,並公開使用 OData 的資料。這些都是公開 (Expose) 可進一步由 Web 應用程式的參考大型資料集的高比例服務的範例。我將說明,這些服務公開 (Expose) 使用 OData 其資料時,’s 簡單會使用該資料,從各種不同的應用程式。

說明,OGDI 網站的特色華盛頓,D.C.區域有關公開提供使用的資料。Contoso ’s 房地產應用程式用於瀏覽該儲存區內的清單,而且可能很有幫助,讓使用者有可用的這部分參考特定的屬性周圍區域的相關資料檢視它時。當我建立範例應用程式的用戶端時,我示範如何包含從 OGDI 網站摘要為應用程式的資料來源之一的 OData。

其他 OData 生產者

到目前為止,我顯示消耗資料從 SQL Server、 SharePoint 和一般的 OData 服務 Web 上的範例,但有更多的選項。定域機組基礎 Windows Azure 平台有資料表服務所公開的資料儲存在 Windows Azure 的資料表,並使用 OData 來建置此 API。如上所述,Microsoft 達拉斯專案是尋找和查詢資料達拉斯] 服務所公開的資料服務商場與這項服務會公開它使用 OData 通訊協定的資料。OData 生產者 aren’t 可能只限於 Microsoft 產品,IBM 最近宣佈 WebSphere 極端縮放比例 7.0 產品現在支援 OData 通訊協定。

Silverlight 用戶端

Contoso ’s 房地產搜尋工具應用現在已經讓 ASP.NET Web 服務公開關聯式資料在 SQL Server 中關於房地產清單和公司所管理的屬性 ; 被用來管理公司的代理程式,關於資料及政府公開屬性周圍區域的相關資料的 Web 服務的 SharePoint 網站廣告公司。我想要將所有這些來源一起放入一個 Silverlight 應用程式,可以使用這個資料中有意義的方式。

在 Silverlight 3,WCF 資料服務用戶端程式庫會包含在 Silverlight SDK,讓它變得簡單的 Silverlight 應用程式,與 ’s OData 啟用的服務進行通訊。若要這麼做,從 Silverlight 專案在 Visual Studio 中專案上按一下滑鼠右鍵,然後選取 [加入服務參考]。這會讓您逐步建立服務參考的程序。服務參考主要的輸入是從 Silverlight 應用程式所參考之服務的 URI。圖 7 顯示 [加入服務參考 OGDI 範例服務的範例。


圖 7 新增 OGDI 範例服務的服務參考

服務參考精靈建立用來與資料服務互動的用戶端內容類別。用戶端內容擷取使用 HTTP 和 URI 從用戶端程式撰寫模型的詳細資料,並可讓用戶端開發人員只考慮 C# 類別和 XAML。用戶端內容也包括 LINQ 提供者實作,並支援在 Proxy 上的 LINQ 查詢的結果。加入服務參考] 精靈也會產生一組的鏡像公開所參考之服務類型的用戶端 Proxy 類別。建立 OGDI 服務參考之後,我也會建立 SharePoint] 及 [清單我所建立的服務的服務參考。這個程式碼會示範如何建立用來與三個 OData 服務互動的內容:

// OGDI service context
OGDIService.dcDataService OGDIService = 
  new dcDataService(new Uri(OGDIServiceURI));

// SharePoint service context
AgentsReference.AgentsDataContext agentsService = 
  new AgentsReference.AgentsDataContext(new Uri(sharepointServiceURI));

// Listings Service context
ListingReference.ListingsEntities listingsService =
  new ListingReference.ListingsEntities(new Uri(listingsServiceURI));

圖 8 顯示 [Silverlight 的不動產首頁搜尋應用程式的外框。應用程式會使 ’s 輕鬆地使用我現有的使用者是用來在 SharePoint 環境中工作在 SharePoint 中裝載。


圖 8 的 Contoso 首頁搜尋

圖 9 包含查詢清單服務和繫結至格線,頂端的 [首頁搜尋 Silverlight 應用程式的結果程式碼。

圖 9 建立用戶端 Proxy 內容

private void getListings()
{
  DataServiceCollection<Listing> listings = new 
    DataServiceCollection<Listing>();

  listingsGrid.ItemsSource = listings;
  
  var query = from listing in
              listingsService.Listings.Expand("Property")
              select listing;
  listings.LoadAsync(query);
}

[圖 9] 中的程式碼會建立一個 DataServiceCollection ’s 追蹤的集合,並將集合繫結至主清單的方格的 [ItemsSource] 屬性。 因為這個集合實作變更追蹤,方格中的項目所做的任何變更會自動反映清單集合中的項目上。 在方格中所做的變更可以藉由在內容中呼叫 BeginSaveChanges 方法清單服務會保留。

在 Silverlight,網路中的所有呼叫都進行非同步,讓執行任何作業服務,使用 WCF 資料服務用戶端程式庫包含初始的呼叫至作業之後,再寫入傳遞至方法,以處理非同步呼叫的結果的不同的回呼方法。 若要改善這個非同步的經驗,DataServiceCollection] 類別的 [處理非同步回呼函式和結果載入集合的所有工作的 LoadAsync 加入方法。

圖 9 的程式碼,集合是結合到格線之前進行 LoadAsync 呼叫,是與值 won’t 載入到集合中,直到非同步呼叫完成後。 集合將會引發集合變更的事件時,結果會傳回從服務,和格線會攔截這些事件,並顯示結果,在非同步呼叫完成時。

當您選取清單時從資料格時,SharePoint 網站需要查詢以取得代理程式管理該清單的相關資訊。 在這種應用程式架構被需要第二個查詢,因為清單型別和代理程式類型的來源資料是分開,並有 ’s 兩者之間的不明確的關聯性,(如果您是認為的模型的人、 此範例包含兩個完全不同的模型和模型之間的關聯性是一個人工一建立和強制執行用戶端)。

圖 10 示範如何查詢 SharePoint 服務代理程式] 實體指定代理程式的名稱。 類似的程式碼順序用來查詢 OGDI 資料的鄰居統計資料,在首頁搜尋頁面底部的圖表中。 到目前為止的程式碼會示範只查詢功能的 Silverlight] 用戶端,但用戶端 isn’t 限制為只查詢 ; 它豐富的功能回寫變更服務從用戶端。

圖 10 執行非同步的查詢

private void GetAgentData(string agentName)
{
    var query = agentsService.Agents.Where(a => a.FullName == agentName) as 
        DataServiceQuery;

    query.BeginExecute(
        AgentQueryCallBack, query);
}

private void AgentQueryCallBack(IAsyncResult result)
{
    Dispatcher.BeginInvoke(() =>
    {
        var queryResult = result.AsyncState as DataServiceQuery<AgentsItem>;
        if (queryResult != null)
        {
            var agents = queryResult.EndExecute(result);
            this.grdAgent.DataContext = agents.First();
        }
    });
}

在 PowerPivot OData

PowerPivot 是一個新的記憶體中商務智慧工具,傳遞做為增益集的 Microsoft Excel 2010) powerpivot.com 的詳細資訊,請瀏覽。此工具會提供從資料來源中匯入大量的資料集並執行複雜的資料分析和報告的支援。PowerPivot 可以從數目包括直接從一個 OData 餵送的不同的資料來源中匯入資料。PowerPivot ’s 從資料摘要選項 (如 的 [圖 11] 所示),可接受 OData 服務端點為匯入摘要的位置。


圖 11 PowerPivot 匯入,從 OData 摘要

圖 12 顯示圖表,從此 OGDI ’s 華盛頓,D.C.資料餵送的犯罪統計資料的摘要。


圖 12 的 PowerPivot 圖從 OData 送紙

圖 12 與房地產應用程式,在先前的範例中使用相同的資料集進行中的圖表顯示每個學區的所有資料的摘要。我建議您下載的 Excel 2010 PowerPivot OGDI 站台,在 ogdi.cloudapp.net/v1/dc ,從匯入的資料,並查看如何快速您做豐富的資料分析透過此資料。

開啟的資料通訊協定視覺化檢視

OGDI 資料服務是基本上是一個 「 黑箱 」 至一個外部的程式開發人員建立的應用程式,使用服務所公開的資料。幸好,OGDI 服務會公開使用 OData] 通訊協定,所以有 ’s 不需要知道與它互動服務的內部詳細資料其資料。服務的程式撰寫模型是 OData 通訊協定。服務端點描述資料的圖形,如我在前一節中顯示您,’s 所有您需要與服務互動。但是,它 ’s 通常用於服務中檢視資料的圖形,並取得更好的了解,該服務的各部分之間的關聯性。建立此用途的開啟的資料通訊協定視覺化檢視。’s 可以從 [工具 | 延伸管理員在 Visual Studio 2010 的功能表項目。圖 13 顯示 OGDI 服務結構的視覺化檢視以顯示兩個檢視。

圖 13 中最上層的檢視會顯示整個服務 ; 下方檢視放大顯示僅有四個方塊中顯示。視覺化檢視代表實體集為方塊中,並以線條連接該方塊的實體之間的關係。它 ’s 清除從頂端檢視在 的 圖 13 OGDI 服務是完全平面及 doesn’t 包含的所有關聯性的就所有沒有任何方塊之間的連接線。這是只有 OGDI 服務的特性,而且 isn’t 典型的大部分 OData 服務。下方檢視顯示的四個實體的特寫設定服務中。只從檢查檢視,您可以判斷服務會針對每個這些類型公開有關火災電台、 小學學校出席、 dialysis clinics 政府的位置,以及屬性和索引鍵的資料。


圖 13 的 開啟資料視覺化檢視檢視表的 OGDI 範例服務

進一步瞭解

本文介紹開啟的資料通訊協定,以及生態系統,已經建置周圍,包括 WCF 資料服務架構。如需詳細資訊,請造訪開啟資料通訊協定的 Web 站台,在 odata.org 。若要學習更多有關 WCF 資料服務,請參閱 msdn.microsoft.com/data/bb931106blogs.msdn.com/astoriateam 在 WCF 資料服務部落格]。

Shayne Burgess 是經理,在 [資料] 與 [模型群組在 Microsoft] 中使用特別的 WCF 資料服務和開啟資料通訊協定。Burgess 定期的部落格上 WCF 資料服務小組部落格,在blogs.msdn.com/b/astoriateam

多虧來檢閱本文的下列的技術專家:Elisa Flasko 與 Mike Flasko