CodeZine(コードジン)

特集ページ一覧

ADO.NET Data ServicesでRESTfulなサービスを実現する

ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク(4)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/02/04 14:00
目次

ADO.NET Data Servicesの中身

 続いてData Servicesの作成ですが、その前にホスト先を固定するためにポートの設定を行います。ソリューション エクスプローラのプロジェクト上で右クリックし、[プロパティ]を選択します。[Web]タブ-[サーバー]カテゴリ-[ポートの指定をする]を選択し、テキストボックスに''50000''と設定します。

図7 プロジェクトのプロパティ
図7 プロジェクトのプロパティ

 ポートの設定が終わった後、ソリューション エクスプローラ上で右クリックし、[新しい項目の追加]を選択します。選択後[新しい項目の追加]ダイアログが表示されるので、テンプレートとして「ADO.NET Data Service」を選択し、名前を「PubsAstoria.svc」と設定後[追加]ボタンをクリックします(図8)。

図8 プロジェクトのプロパティ
図8 プロジェクトのプロパティ

 Data Servicesを作成すると、以下の構文が自動生成されます。太字の部分が開発者が自分で記述する部分です。

    public class PubsAstoria : DataService<Model.pubsEntities>
    {
        public static void InitializeService(IDataServiceConfiguration config)
        {
            // TODO: 表示や更新などが可能なエンティティ セットおよびサービス操作を示す規則を設定してください
            // 例:
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            // config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
        }
    }

 InitializeServiceメソッドはサービス呼び出し時にポリシーを初期化するために一度呼び出されるメソッドです。ここで、権限、リクエストの制限、型の登録、エラー処理結果等を設定します。

 InitializeServiceメソッドのパラメータには、Data Servicesの動作を設定するIDataServiceConfigurationインターフェイスが利用されます。

 SetEntitySetAccessRuleメソッドは第1パラメータにString型でEDM内のアクセス可能なエンティティ型を設定し(*は全てのテーブル。具体的にアクセスしたいテーブルのみを指定することも可能)、第2パラメータにEntitySetRights列挙体の中からエンティティ型に対する権限を設定します。

 EntitySetRights列挙体は以下のような権限があります。

System.Data.Services.EntitySetRights 列挙体
メンバ名 概要
None データへのアクセスを拒否
ReadSingle 単一のデータ項目の読み取りのみ許可
ReadMultiple データ セットの読み取りのみ許可
WriteAppend 新しいデータ項目をデータ セットに作成許可
WriteReplace データの置換許可
WriteDelete データ セットからデータ項目の削除許可
WriteMerge データをマージする許可
AllRead データ読み取り許可
AllWrite データ書き込み許可
All データの作成、読み取り、更新、削除の全てを許可

 サンプルでは、EDMの全てのエンティティ型を表示させるために「*」を、全ての項目を許可するAllを設定しています。以上で、Data Services側の設定は完了です。デバッグ実行すると、図1の様な画面が表示されます。生成されるソースは以下の通りです。

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<feed xml:base="http://localhost:50000/PubsAstoria.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">titles</title> 
    <id>http://localhost:50000/PubsAstoria.svc/titles/</id> 
    <updated>2008-11-19T06:06:19Z</updated> 
    <link rel="self" title="titles" href="titles"   /> 
    <entry>
        <id>http://localhost:50000/PubsAstoria.svc/titles('BU1032')</id> 
        <title type="text"   /> 
        <updated>2008-11-19T06:06:19Z</updated> 
        <author>
          <name   /> 
        </author>
        <link rel="edit" title="titles" href="titles('BU1032')"   /> 
        <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/publishers" type="application/atom+xml;type=entry" title="publishers" href="titles('BU1032')/publishers"   /> 
        <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/roysched" type="application/atom+xml;type=entry" title="roysched" href="titles('BU1032')/roysched"   /> 
        <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/sales" type="application/atom+xml;type=feed" title="sales" href="titles('BU1032')/sales"   /> 
        <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/titleauthor" type="application/atom+xml;type=feed" title="titleauthor" href="titles('BU1032')/titleauthor"   /> 
        <category term="pubsModel.titles" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"   /> 
        <content type="application/xml">
            <m:properties>
                <d:advance m:type="Edm.Decimal">5000.0000</d:advance> 
                <d:notes>An overview of available database systems with emphasis on common business applications. Illustrated.</d:notes> 
                <d:price m:type="Edm.Decimal">19.9900</d:price> 
                <d:pubdate m:type="Edm.DateTime">1991-06-12T00:00:00</d:pubdate> 
                <d:royalty m:type="Edm.Int32">10</d:royalty> 
                <d:title>The Busy Executive's Database Guide</d:title> 
                <d:title_id>BU1032</d:title_id> 
                <d:type xml:space="preserve">business</d:type> 
                <d:ytd_sales m:type="Edm.Int32">4095</d:ytd_sales> 
            </m:properties>
        </content>
    </entry>
<中略>
</feed>

 entryごとにレコードが区切られているため、レコードの数だけentryタグが生成されています。また、各レコードから次のフィードへのリンクが書きこまれているのも確認できます。上記コードでは''http://localhost:50000/PubsAstoria.svc/titles('BU1032')''がそれにあたります。実際にリクエストを行うと以下のフィードが返されます。

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<entry xml:base="http://localhost:50000/PubsAstoria.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:50000/PubsAstoria.svc/titles('BU1032')</id>
    <title type="text"   />
    <updated>2008-11-19T06:23:16Z</updated>
    <author>
        <name   />
    </author>
    <link rel="edit" title="titles" href="titles('BU1032')"   />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/publishers" type="application/atom+xml;type=entry" title="publishers" href="titles('BU1032')/publishers"   />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/roysched" type="application/atom+xml;type=entry" title="roysched" href="titles('BU1032')/roysched"   />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/sales" type="application/atom+xml;type=feed" title="sales" href="titles('BU1032')/sales"   />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/titleauthor" type="application/atom+xml;type=feed" title="titleauthor" href="titles('BU1032')/titleauthor"   />
    <category term="pubsModel.titles" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"   />
    <content type="application/xml">
        <m:properties>
            <d:advance m:type="Edm.Decimal">5000.0000</d:advance>
            <d:notes>An overview of available database systems with emphasis on common business applications. Illustrated.</d:notes>
            <d:price m:type="Edm.Decimal">19.9900</d:price>
            <d:pubdate m:type="Edm.DateTime">1991-06-12T00:00:00</d:pubdate>
            <d:royalty m:type="Edm.Int32">10</d:royalty>
            <d:title>The Busy Executive's Database Guide</d:title>
            <d:title_id>BU1032</d:title_id>
            <d:type xml:space="preserve">business</d:type>
            <d:ytd_sales m:type="Edm.Int32">4095</d:ytd_sales>
        </m:properties>
    </content>
</entry>

 ''http://localhost:50000/PubsAstoria.svc/titles('BU1032')''の('BU1032')はtitlesテーブルの主キーの値で、これ以上たどることはできないため、この先のリンクがフィード内に記述されていません。

 Data ServicesはURIに追加でオプションを設定することもできます。現在実装されているオプションは以下の表の通りです。

System.Data.Services.EntitySetRights 列挙体とURIの例
オプション 概要
$expand 返されるフィードが展開されるかインラインとして返されるかを設定 http://localhost:50000/PubsAstoria.svc/publishers?$expand=city
$filter 指定された引数を満たすエンティティのみを返す /PubsAstoria.svc/publishers?$filter=city eq 'Boston'
$orderby エンティティを昇順または降順でソート /PubsAstoria.svc/publishers?$orderby=city
$skip 指定した個数のレコードをスキップし、それ以降のレコードを返す /PubsAstoria.svc/publishers?$skip=1
$top 最初のレコードから、指定した個数のレコードまでを返す /PubsAstoria.svc/publishers?$top=2

 こちらも併せてURIに指定することで、より利用しやすいデータを取得することができるようになります。是非活用してください。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト ナオキ(ナオキ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5