透過遵循本主題的程序,您就可以使用 ADO.NET 資料服務來建立並測試連接至 Northwind 範例資料庫的資料服務。
若要建立這個範例資料服務,請先確定您的電腦已經安裝本主題「必要條件」一節所列的必要元件。若要建立這個資料服務,請遵循下列程序:
建立 ASP.NET Web 應用程式。
建立 Entity Data Model (EDM) 並將此模型連接至資料庫。
在 Web 應用程式中建立資料服務。
啟用資料服務的存取權。
在您使用這些程序來建立並啟用資料服務之後,就可以嘗試已經實作的範例資料服務。
必要條件
若要使用 ADO.NET 資料服務架構來建立資料服務,您必須在電腦上安裝下列元件:
ADO.NET 資料服務和 ADO.NET Entity Framework。當您安裝 Microsoft .NET Framework 3.5 Service Pack 1 (SP1) 或更新版本時,就會安裝這兩個元件。
ADO.NET 資料服務架構包含執行階段和資料存取元件。執行階段元件會實作 URI 轉譯、AtomPub 與 JSON 傳輸格式,以及互動通訊協定 (Protocol)。資料存取元件會使用 IQueryable<T> 介面來支援元件之間的通訊。有一組慣例會將 Common Language Runtime (CLR) 型別對應至 ADO.NET 資料服務所使用的 URI 語法和裝載通訊協定。
Entity Framework 工具。這些工具包含在 Visual Studio 2008 Service Pack 1 (SP1) 中。
ADO.NET 資料存取提供者。所有 Microsoft SQL Server 2005 版本都支援這些提供者。這包括 SQL Server Express。
Northwind 範例資料庫。若要下載此範例資料庫,請參閱下載頁面:SQL Server 的範例資料庫 (英文)。
建立 ASP.NET Web 應用程式
ADO.NET 資料服務是 Windows Communication Foundation 服務的特殊化版本。ADO.NET 資料服務會在 ASP.NET 網站內部執行。
如果您已經擁有 ASP.NET Web 應用程式,而且想要將範例資料服務加入至這個現有的應用程式,可以略過下列步驟並移至下一節「建立 Entity Data Model」。
附註 |
|---|
下列程序會使用 Visual Studio 2008 SP1 的 Standard、Professional 和 Team System 版本。如果您使用了 Visual Studio Web Developer,就必須建立新的網站而非新的 Web 應用程式。 |
在 Visual Studio 的 [檔案] 中,選取 [新增],然後選取 [專案]。
在 [新增專案] 對話方塊中,選取 Visual Basic 或 Visual C# 當做程式語言。
在 [範本] 窗格中,選取 [ASP.NET Web 應用程式]。
輸入專案的名稱,例如 SimpleDataService。
按一下 [確定]。
建立 Entity Data Model
若要使用 ADO.NET Entity Framework 來建立以關聯式資料庫為基礎的 EDM:
在 [方案總管] 中,以滑鼠右鍵按一下您剛建立之 ASP.NET 專案的名稱,然後按一下 [加入新項目]。
在 [加入新項目] 對話方塊中,選取 [ADO.NET 實體資料模型]。
針對資料模型的名稱,輸入 Northwind。
Northwind.edmx 就是 Entity Data Model 精靈所建立之資料模型的檔案名稱。所建立之資料模型的結構描述會一對一對應至 Northwind 範例資料庫。
在 Entity Data Model 精靈中,選取 [從資料庫產生],然後按 [下一步]。
進行下列其中一項步驟,將資料模型連接至資料庫,然後按 [下一步]:
如果您尚未設定資料庫連接,請按一下 [新增連接],然後建立新的連接。
附註如果您正在使用 SQL Server 2005,我們建議您將 [MultipleActiveResultSets] 選項設定為 true。如果這個選項沒有在連接字串中設定為 true,請在 [連接屬性] 對話方塊中,按一下 [進階],然後將 [MultipleActiveResultSets] 選項設定為 true。
–或–
如果您擁有已經設定為連接至 Northwind 資料庫的資料庫連接,請從連接清單中選取該連接。
在精靈的最後一頁上,選取資料庫中所有資料表的核取方塊,並且清除檢視表和預存程序 (Stored Procedure) 的核取方塊。
精靈的最後一頁會顯示資料庫所提供之資料表、檢視表和預存程序的清單。若要讓您在本主題中建立的資料模型保持簡單,請單獨選取資料表。
按一下 [完成] 關閉精靈。
此精靈會產生代表資料庫中繼資料的檔案,並且將這些檔案加入至專案。
建立資料服務
建立 ADO.NET 資料服務會將先前步驟所建立資料模型部署成可由網際網路通訊協定存取的服務。
若要建立資料服務:
在 [方案總管] 中,以滑鼠右鍵按一下 ASP.NET 專案的名稱,然後按一下 [加入新項目]。
在 [加入新項目] 對話方塊中,選取 [ADO.NET 資料服務]。
附註請務必選取 ADO.NET 資料服務,而非其他類似的選項,例如 Web 服務。
針對服務的名稱,輸入 Northwind。
Visual Studio 會針對新的服務建立 XML 標記和程式碼檔案。根據預設,程式碼編輯器視窗隨即開啟。在 [方案總管] 中,此服務將會具有名稱 Northwind,而且副檔名為 .svc.cs 或 .svc.vb。
在資料服務程式碼的開頭,進行下列其中一項步驟,以便包含 Entity Data Model 精靈所產生之資料模型類別 (Class) 的命名空間 (Namespace):
如果您的 ASP.NET 應用程式使用了 Visual Basic,請加入
imports陳述式 (Statement)。如果您的 ASP.NET 應用程式使用了 C#,請加入
using陳述式。
Visual Studio 物件瀏覽器會顯示衍生自資料服務所使用之資料庫的命名空間。在此範例中,資料庫名為 Northwind,而命名空間名為 NorthwindModel。
在資料服務的程式碼中,找出 "TODO" 註解,並且將這個註解取代成 Entity Data Model 精靈所產生之類別的名稱。
在此範例中,Entity Data Model 精靈所產生之類別的名稱是 NorthwindModel 命名空間中的 NorthwindEntities。
啟用資料服務的存取權
根據預設,資料服務不會啟用任何資源的存取權。您必須先明確啟用存取權,然後資料服務才能傳回資料。
若要啟用與此服務相關聯之所有資源的讀取和寫入存取權,請在衍生自 DataService 的類別中尋找 InitializeService 函式。針對此函式,加入將容器資源權限設定為 All 所需的程式碼。在 C# 中,請將 config.SetResourceContainerAccessRule("*", ResourceContainerRights.All) 這一行加入至 InitializeService 函式,如下列程式碼所示:
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
using NorthwindModel;
namespace SimpleDataService
{
public class Northwind : DataService< NorthwindModel.NorthwindEntities >
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(IDataServiceConfiguration config)
{
// TODO: set rules to indicate which entity sets and
// service operations are visible and updatable.
// Use *(all sets) only for testing.
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
}
}
}
現在,您可以從 Visual Studio 執行此服務。按下 F5 開始 Web 伺服器的開發作業。下一節將說明如何使用新建立的資料服務。
嘗試資料服務
基於此範例的目的,請使用 Web 瀏覽器來與資料服務互動。Web 瀏覽器可讓您輕鬆地試驗處理要求的語法和檢視結果。不過,當資料服務已完成而且處於使用中狀態時,Web 瀏覽器並非大部分應用程式用於與資料服務互動的方法。一般而言,應用程式會透過程式碼或指令碼語言,與資料服務互動。
附註 |
|---|
如需 ADO.NET 資料服務所使用之 HTTP 語法的詳細資訊,請參閱包含統一 URI 的簡單資料定址配置 (ADO.NET 資料服務架構)和 ADO.NET 資料服務的用戶端應用程式。 |
擷取預設的服務文件
根據預設,資料服務所傳回的 XML 文件是 AtomPub 服務文件。AtomPub 是預設的序列化 (Serialization) 方法。如需 ATOM 通訊協定的詳細資訊,請參閱 ADO.NET 資料服務小組網站 (英文)。
若要要求預設的服務文件:
開啟 Web 瀏覽器,然後輸入類似下列 URI,並替代通訊埠編號以符合您的開發環境:
https://localhost:50781/northwind.svc
如果已經根據先前的 URI 設定存取規則,資料服務就會將預設的服務文件傳回至瀏覽器。這個預設的服務文件包含代表資料服務所部署之 Northwind 資料的實體集清單。這個預設的服務文件類似下列 XML 範例:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<service xml:base="https://localhost:1365/Northwind.svc/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
<workspace>
<atom:title>Default</atom:title>
<collection href="Categories">
<atom:title>Categories</atom:title>
</collection>
<collection href="CustomerDemographics">
<atom:title>CustomerDemographics</atom:title>
</collection>
<collection href="Customers">
<atom:title>Customers</atom:title>
</collection>
<collection href="Employees">
<atom:title>Employees</atom:title>
</collection>
<collection href="Order_Details">
<atom:title>Order_Details</atom:title>
</collection>
<collection href="Orders">
<atom:title>Orders</atom:title>
</collection>
<collection href="Products">
<atom:title>Products</atom:title>
</collection>
<collection href="Region">
<atom:title>Region</atom:title>
</collection>
<collection href="Shippers">
<atom:title>Shippers</atom:title>
</collection>
<collection href="Suppliers">
<atom:title>Suppliers</atom:title>
</collection>
<collection href="Territories">
<atom:title>Territories</atom:title>
</collection>
</workspace>
</service>
擷取實體集
若要瀏覽資料服務的內容,請使用預設服務文件中的實體集當做起點。例如,範例資料服務之預設服務文件中的某些實體集包含 Products、Shippers 和 Territories。您可以輕鬆地傳回其中一個實體集中的所有實體。
若要要求產品的清單
在 Web 瀏覽器中,輸入下列 URI:
https://localhost/northwind.svc/Products
透過將 /Products 加入至 URI,此 URI 就會傳回儲存區中的所有產品。下列 XML 會顯示傳回的前四個產品,而這是結果的部分清單:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="https://localhost:1365/Northwind.svc/" xmlns:d="https://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="https://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">Products</title>
<id>https://localhost:1365/Northwind.svc/Products</id>
<updated>2008-05-22T16:42:14Z</updated>
<link rel="self" title="Products" href="Products" />
<entry m:type="NorthwindModel.Products">
<id>https://localhost:1365/Northwind.svc/Products(1)</id>
<title type="text"></title>
<updated>2008-05-22T16:42:14Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Products" href="Products(1)" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
type="application/atom+xml;type=entry" title="Categories" href="Products(1)/Categories" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details"
type="application/atom+xml;type=feed" title="Order_Details" href="Products(1)/Order_Details" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Suppliers"
type="application/atom+xml;type=entry" title="Suppliers" href="Products(1)/Suppliers" />
<content type="application/xml">
<m:properties>
<d:Discontinued m:type="Edm.Boolean">false</d:Discontinued>
<d:ProductID m:type="Edm.Int32">1</d:ProductID>
<d:ProductName>Chai</d:ProductName>
<d:QuantityPerUnit>10 boxes x 20 bags</d:QuantityPerUnit>
<d:ReorderLevel m:type="Edm.Int16">10</d:ReorderLevel>
<d:UnitPrice m:type="Edm.Decimal">18.0000</d:UnitPrice>
<d:UnitsInStock m:type="Edm.Int16">36</d:UnitsInStock>
<d:UnitsOnOrder m:type="Edm.Int16">0</d:UnitsOnOrder>
</m:properties>
</content>
</entry>
<entry m:type="NorthwindModel.Products">
<id>https://localhost:1365/Northwind.svc/Products(2)</id>
<title type="text"></title>
<updated>2008-05-22T16:42:14Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Products" href="Products(2)" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
type="application/atom+xml;type=entry" title="Categories" href="Products(2)/Categories" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details"
type="application/atom+xml;type=feed" title="Order_Details" href="Products(2)/Order_Details" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Suppliers"
type="application/atom+xml;type=entry" title="Suppliers" href="Products(2)/Suppliers" />
<content type="application/xml">
<m:properties>
<d:Discontinued m:type="Edm.Boolean">false</d:Discontinued>
<d:ProductID m:type="Edm.Int32">2</d:ProductID>
<d:ProductName>Chang</d:ProductName>
<d:QuantityPerUnit>24 - 12 oz bottles</d:QuantityPerUnit>
<d:ReorderLevel m:type="Edm.Int16">25</d:ReorderLevel>
<d:UnitPrice m:type="Edm.Decimal">19.0000</d:UnitPrice>
<d:UnitsInStock m:type="Edm.Int16">28</d:UnitsInStock>
<d:UnitsOnOrder m:type="Edm.Int16">40</d:UnitsOnOrder>
</m:properties>
</content>
</entry>
<entry m:type="NorthwindModel.Products">
<id>https://localhost:1365/Northwind.svc/Products(3)</id>
<title type="text"></title>
<updated>2008-05-22T16:42:14Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Products" href="Products(3)" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
type="application/atom+xml;type=entry" title="Categories" href="Products(3)/Categories" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details"
type="application/atom+xml;type=feed" title="Order_Details" href="Products(3)/Order_Details" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Suppliers"
type="application/atom+xml;type=entry" title="Suppliers" href="Products(3)/Suppliers" />
<content type="application/xml">
<m:properties>
<d:Discontinued m:type="Edm.Boolean">false</d:Discontinued>
<d:ProductID m:type="Edm.Int32">3</d:ProductID>
<d:ProductName>Aniseed Syrup</d:ProductName>
<d:QuantityPerUnit>12 - 550 ml bottles</d:QuantityPerUnit>
<d:ReorderLevel m:type="Edm.Int16">25</d:ReorderLevel>
<d:UnitPrice m:type="Edm.Decimal">10.0000</d:UnitPrice>
<d:UnitsInStock m:type="Edm.Int16">65</d:UnitsInStock>
<d:UnitsOnOrder m:type="Edm.Int16">70</d:UnitsOnOrder>
</m:properties>
</content>
</entry>
<entry m:type="NorthwindModel.Products">
<id>https://localhost:1365/Northwind.svc/Products(4)</id>
<title type="text"></title>
<updated>2008-05-22T16:42:14Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Products" href="Products(4)" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
type="application/atom+xml;type=entry" title="Categories" href="Products(4)/Categories" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details"
type="application/atom+xml;type=feed" title="Order_Details" href="Products(4)/Order_Details" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Suppliers"
type="application/atom+xml;type=entry" title="Suppliers" href="Products(4)/Suppliers" />
<content type="application/xml">
<m:properties>
<d:Discontinued m:type="Edm.Boolean">false</d:Discontinued>
<d:ProductID m:type="Edm.Int32">4</d:ProductID>
<d:ProductName>Chef Anton's Cajun Seasoning</d:ProductName>
<d:QuantityPerUnit>48 - 6 oz jars</d:QuantityPerUnit>
<d:ReorderLevel m:type="Edm.Int16">0</d:ReorderLevel>
<d:UnitPrice m:type="Edm.Decimal">22.0000</d:UnitPrice>
<d:UnitsInStock m:type="Edm.Int16">6</d:UnitsInStock>
<d:UnitsOnOrder m:type="Edm.Int16">0</d:UnitsOnOrder>
</m:properties>
</content>
</entry>
</feed>
擷取單一實體
您不僅能夠傳回實體集中的實體清單,而且還可以要求特定實體。個別實體的 URI 包含服務的基底 URI,後面接著實體集的名稱,然後是實體的最終識別碼。實體的識別碼是括號中的索引鍵值。
若要要求識別碼為 1 的產品:
在 Web 瀏覽器中,輸入下列 URI:
http://host/vdir/northwind.svc/Products(1)
您剛輸入瀏覽器中的 URI 就會擷取識別碼為 1 的產品。下列 XML 會顯示這個要求的結果:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xml:base="https://localhost:1365/Northwind.svc/"
xmlns:d="https://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="https://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
m:type="NorthwindModel.Products" xmlns="http://www.w3.org/2005/Atom">
<id>https://localhost:1365/Northwind.svc/Products(1)</id>
<title type="text"></title>
<updated>2008-05-22T16:47:12Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Products" href="Products(1)" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
type="application/atom+xml;type=entry" title="Categories" href="Products(1)/Categories" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details"
type="application/atom+xml;type=feed" title="Order_Details" href="Products(1)/Order_Details" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Suppliers"
type="application/atom+xml;type=entry" title="Suppliers" href="Products(1)/Suppliers" />
<content type="application/xml">
<m:properties>
<d:Discontinued m:type="Edm.Boolean">false</d:Discontinued>
<d:ProductID m:type="Edm.Int32">1</d:ProductID>
<d:ProductName>Chai</d:ProductName>
<d:QuantityPerUnit>10 boxes x 20 bags</d:QuantityPerUnit>
<d:ReorderLevel m:type="Edm.Int16">10</d:ReorderLevel>
<d:UnitPrice m:type="Edm.Decimal">18.0000</d:UnitPrice>
<d:UnitsInStock m:type="Edm.Int16">36</d:UnitsInStock>
<d:UnitsOnOrder m:type="Edm.Int16">0</d:UnitsOnOrder>
</m:properties>
</content>
</entry>
擷取實體關聯性
在這個範例資料服務中,某些值是純量,例如 ProductName 和 UnitPrice。其他值 (例如 Categories 和 Suppliers) 則代表導覽屬性的結尾。導覽屬性是找出經由 EDM 關聯而相關之實體的捷徑屬性。
例如,Products 實體包含代表 Suppliers 和 Categories 之實體的關聯。您可以建立周遊這些關聯性的 URI。
若要要求識別碼為 2 之產品的供應商:
在 Web 瀏覽器中,輸入下列 URI:
http://host/vdir/northwind.svc/Products(2)/Suppliers
下列 XML 會顯示這個要求的結果:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xml:base="https://localhost:1365/Northwind.svc/"
xmlns:d="https://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="https://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
m:type="NorthwindModel.Suppliers" xmlns="http://www.w3.org/2005/Atom">
<id>https://localhost:1365/Northwind.svc/Suppliers(1)</id>
<title type="text"></title>
<updated>2008-05-22T16:50:11Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Suppliers" href="Suppliers(1)" />
<link rel="https://schemas.microsoft.com/ado/2007/08/dataservices/related/Products"
type="application/atom+xml;type=feed" title="Products" href="Suppliers(1)/Products" />
<content type="application/xml">
<m:properties>
<d:Address>49 Gilbert St.</d:Address>
<d:City>London</d:City>
<d:CompanyName>Exotic Liquids</d:CompanyName>
<d:ContactName>Charlotte Cooper</d:ContactName>
<d:ContactTitle>Purchasing Manager</d:ContactTitle>
<d:Country>UK</d:Country>
<d:Fax m:null="true" />
<d:HomePage m:null="true" />
<d:Phone>(171) 555-2222</d:Phone>
<d:PostalCode>EC1 4SD</d:PostalCode>
<d:Region m:null="true" />
<d:SupplierID m:type="Edm.Int32">1</d:SupplierID>
</m:properties>
</content>
</entry>
另請參閱
概念
用於定址資源的 URI 格式 (ADO.NET 資料服務架構)
一般 HTTP 需求 (ADO.NET 資料服務架構)