特集:Visual Studio 2008 SP1新機能解説(3)

RESTスタイルのWebサービスを手軽に公開する
「ADO.NET Data Services」

WINGSプロジェクト 土井 毅 著/山田 祥寛 監修
2008/12/12
Page1 Page2 Page3

サンプル − ADO.NET Data Servicesの公開

 それではADO.NET Data Servicesを実際に使ってみよう。ここでは以下の手順でサンプルを作成していく。

  1. ADO.NET Entity Data Modelを追加する
  2. ADO.NET Data Serviceを作成する(このServiceは単数形である。本稿ではフレームワークを指す場合はServicesを用い、サービスのエントリ・ポイントを指す場合は単数形を用いている)
  3. Webブラウザで表示を確認する
  4. 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表現に慣れておこう。


 INDEX
  Visual Studio 2008 SP1新機能解説(1)
  DBアプリをコーディングレスで構築する「ASP.NET Dynamic Data」
    1.Dynamic Dataアプリケーションの基本
    2.データ・モデルの作成/Global.asaxの編集
    3.メタデータ編集によるDynamic Dataアプリケーションのカスタマイズ
    4.自作ユーザー・コントロールの利用/ページ・テンプレートのカスタマイズ
 
  Visual Studio 2008 SP1新機能解説(2)
  .NETの新データアクセス・テクノロジ「ADO.NET Entity Framework」
    1.ADO.NET Entity Framework概要
    2.Entity Data Model(EDM)の作成と利用
    3.EDMに対するクエリの利用方法(Entity SQL)
    4.EDMに対するクエリの利用方法(Object Services/LINQ to Entities)
 
  Visual Studio 2008 SP1新機能解説(3)
  RESTスタイルのWebサービスを手軽に公開する「ADO.NET Data Services」
    1.ADO.NET Data Services概要/対応するクライアント
  2.サンプル − ADO.NET Data Servicesの公開
    3.ASP.NET AJAX環境のデータを取得/追加する


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間