|
|
特集:Visual Studio 2008 SP1新機能解説(3)
RESTスタイルのWebサービスを手軽に公開する
「ADO.NET Data Services」
WINGSプロジェクト 土井 毅 著/山田 祥寛 監修
2008/12/12 |
|
|
サンプル − ADO.NET Data Servicesの公開
それではADO.NET Data Servicesを実際に使ってみよう。ここでは以下の手順でサンプルを作成していく。
- ADO.NET Entity Data Modelを追加する
- ADO.NET Data Serviceを作成する(このServiceは単数形である。本稿ではフレームワークを指す場合はServicesを用い、サービスのエントリ・ポイントを指す場合は単数形を用いている)
- Webブラウザで表示を確認する
- ASP.NET AJAX環境のデータを取得/追加する
なお、本サンプルを動作させるに当たっては、無償で提供されているNorthwindデータベースを利用可能な状態にしておく必要がある。
[1]ADO.NET Entity Data Modelを追加する
事前にVisual Studio 2008 SP1でWebサイトを作成しておく。そして、「.NETの新データアクセス・テクノロジ「ADO.NET Entity Framework』」の手順を参考に、以下の設定でプロジェクトにEntity Data Modelを追加する。
設定項目 |
設定内容 |
モデルに含めるコンテンツ |
データベースから生成 |
アプリケーションがデータベースへの接続に使用するデータ接続 |
前述のNorthwindデータベース |
エンティティ接続の名前 |
NORTHWNDEntites |
モデルに含めるデータベース・オブジェクト |
[テーブル]にチェック(全テーブルを選択) |
|
表4 Entity Data Model追加時の設定項目 |
|
[2]ADO.NET Data Serviceを作成する
次に、[1]で作成したEntity Data Modelを公開するADO.NET Data Serviceを作成する。
これには、メニュー[プロジェクト]−[新しい項目の追加]で、テンプレートとして「ADO.NET Data Service」を選択して[追加]ボタンをクリックする。ファイル名は「Northwind.svc」とする。なお、このファイル名がURIで指定するサービスのエントリ・ポイントとなる。
|
図2 [新しい項目の追加]ダイアログで「ADO.NET Data Service」を選択する |
|
これによりADO.NET Data Serviceのひな形を含む「Northwind.svc.cs」が生成されるので、以下のように修正を行う(Visual Basicの場合はNorthwind.svc.vbを修正する。)
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
namespace DataServiceSample
{
public class Northwind : DataService<NORTHWNDEntities>
{
// このメソッドは、サービス全体のポリシーを初期化するために、
// 1 度だけ呼び出されます。
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
// TODO: 表示や更新などが可能なエンティティ セットおよび
// サービス操作を示す規則を設定してください
// 例:
// config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
// config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
}
}
}
|
Imports System.Data.Services
Imports System.Linq
Imports System.ServiceModel.Web
Public Class Northwind
' TODO: [[class name]] をデータ クラス名に置き換えてください
Inherits DataService(Of NORTHWNDEntities)
' このメソッドは、サービス全体のポリシーを初期化するために、
' 1 度だけ呼び出されます。
Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration)
config.SetEntitySetAccessRule("*", EntitySetRights.All)
' TODO: 表示や更新などが可能なエンティティ セットおよび
' サービス操作を示す規則を設定してください
' 例:
' config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead)
' config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All)
End Sub
End Class
|
|
リスト3 Northwindクラスのソース・コード(上:C#、下:VB) |
生成されたデータサービス・クラス「Northwind」は、DataServiceクラスを継承しているが、継承元の型パラメータとしてデータサービスで公開するリソースを指定する必要がある。ここでは先ほど作成したEntity Data Modelである「NORTHWNDEntities」を指定する。
InitializeServiceメソッド内は、すべてコメントアウトされている(=いずれのリソースにもアクセス権がないロックアウト状態)ため、IDataServiceConfigurationインターフェイスのSetEntitySetAccessRuleメソッドにより、リソース名とアクセス権を指定する。
リソース名は具体的なテーブル名を指定するが、「*」(アスタリスク)を指定することで、全テーブルを指定可能である。アクセス権はEntitySetRights列挙体の値を指定する(表5)。ここでは、全テーブルに対しすべてのアクセス権を付与している。
列挙体の値 |
意味 |
None |
すべてのアクセス権を拒否(初期状態) |
ReadSingle |
単一のレコードの読み取りを許可(一覧取得は許可されない) |
ReadMultiple |
レコード一覧の読み取りを許可 |
AllRead |
一覧/単一のレコード読み取りを許可 |
WriteAppend |
新しいレコードの挿入を許可 |
WriteReplace |
レコードの更新を許可 |
WriteDelete |
レコードの削除を許可 |
WriteMerge |
レコードのマージを許可 |
AllWrite |
レコードの挿入/更新/削除/マージを許可 |
All |
すべての読み書きを許可 |
|
表5 System.Data.Services.EntitySetRights列挙体とアクセス権種別 |
|
[3]Webブラウザで表示を確認する
[F5]キーを押して、実行確認を行う。最初はNorthwindデータベースのCustomersテーブルの全内容を表示するため、Webブラウザのアドレスに以下のURIを入力する(ポート番号は環境によって異なるので、もともと表示されているものを使用する)。
http://localhost:4651/Northwind.svc/Customers
|
|
[注意]結果が表示されない?
WebブラウザでADO.NET Data Servicesにアクセスすると、特別なプラグインやアドオンなどでAcceptヘッダを変更していない限りは、Atom形式でデータが出力される。しかし環境によっては、以下のようにフィードの購読画面が表示される場合がある。
|
図3 フィードの購読画面 |
|
この場合は、オプションでフィードの購読画面を表示しないようにするか、ソースを表示することで結果を確認できる。
例えばIE7の場合は、メニューの[ツール]−[インターネット オプション]でオプション画面を開き、さらに[コンテンツ]タブにある[設定]ボタンにより[フィードの設定]ダイアログを開き、[フィードの読み取りビューを有効にする]オプションをオフにすることで、購読画面を無効にできる。 |
実行結果(ADO.NET Data Servicesの出力)は以下のような内容となる。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://localhost:4651/Northwind.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">Customers</title>
<id>http://localhost:4651/Northwind.svc/Customers</id>
<updated>2008-10-21T14:42:25Z</updated>
<link rel="self" title="Customers" href="Customers" />
<entry>
<id>http://localhost:4651/Northwind.svc/Customers('ALFKI')</id>
<title type="text"></title>
<updated>2008-10-21T14:42:25Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Customers" href="Customers('ALFKI')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Orders" type="application/atom+xml;type=feed" title="Orders" href="Customers('ALFKI')/Orders" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/CustomerDemographics" type="application/atom+xml;type=feed" title="CustomerDemographics" href="Customers('ALFKI')/CustomerDemographics" />
<category term="NORTHWNDModel.Customers" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Address>Obere Str. 57</d:Address>
<d:City>Berlin</d:City>
<d:CompanyName>Alfreds Futterkiste</d:CompanyName>
<d:ContactName>Maria Anders</d:ContactName>
<d:ContactTitle>Sales Representative</d:ContactTitle>
<d:Country>Germany</d:Country>
<d:CustomerID>ALFKI</d:CustomerID>
<d:Fax>030-0076545</d:Fax>
<d:Phone>030-0074321</d:Phone>
<d:PostalCode>12209</d:PostalCode>
<d:Region m:null="true" />
</m:properties>
</content>
</entry>
<entry>
……以下省略……
|
|
リスト4 Customersテーブル一覧を表すAtomデータ |
ルートの<feed>要素の下に複数の<entry>要素があり、この<entry>要素が1レコードを表している。また、/feed/entry/content/m:properties以下にはレコード内のフィールドが列挙されているのが確認できる。
次に、Customersテーブルの特定のレコードを表示するため、以下のアドレスを指定する。
http://localhost:4651/Northwind.svc/Customers('WOLZA')
|
|
この場合の出力結果は次のようになる。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xml:base="http://localhost:4651/Northwind.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<id>http://localhost:4651/Northwind.svc/Customers('WOLZA')</id>
<title type="text"></title>
<updated>2008-10-21T14:47:26Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Customers" href="Customers('WOLZA')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Orders" type="application/atom+xml;type=feed" title="Orders" href="Customers('WOLZA')/Orders" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/CustomerDemographics" type="application/atom+xml;type=feed" title="CustomerDemographics" href="Customers('WOLZA')/CustomerDemographics" />
<category term="NORTHWNDModel.Customers" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Address>ul. Filtrowa 68</d:Address>
<d:City>Warszawa</d:City>
<d:CompanyName>Wolski Zajazd</d:CompanyName>
<d:ContactName>Zbyszek Piestrzeniewicz</d:ContactName>
<d:ContactTitle>Owner</d:ContactTitle>
<d:Country>Poland</d:Country>
<d:CustomerID>WOLZA</d:CustomerID>
<d:Fax>(26) 642-7012</d:Fax>
<d:Phone>(26) 642-7012</d:Phone>
<d:PostalCode>01-012</d:PostalCode>
<d:Region m:null="true" />
</m:properties>
</content>
</entry>
|
|
リスト5 Customersテーブルの1レコードを表すAtomデータ |
今回は主キーであるCustomerIDの値が「WOLZA」であるレコードのみが表示されている。
ここでは主キーによる1レコードの選択のみを扱ったが、フィルタ、ソート、ページングなど、前述のさまざまなリソース指定についても試し、ADO.NET Data ServicesのURI表現に慣れておこう。
Insider.NET 記事ランキング
本日
月間