更新日: 2010 年 5 月 17 日

Visual Basic の内容はこちらに掲載しています。 10 行でズバリ!! REST サービスの作成 (VB)

このコンテンツのポイント

  • WCF を使用した REST サービス (RESTful サービス) の作成方法を理解する

今回紹介するコード

<IOrderService.cs>

C#
// サービスコントラクト
[ServiceContract]
public interface IOrderService
{
  [OperationContract]
  OrderItem GetOne(string id);
}

// データコントラクト
[DataContract(Namespace = "", Name = "OrderItem")]
public class OrderItem
{
  [DataMember]
  public int Id;
  [DataMember]
  public string Name;
}
 

<OrderService.svc.cs>

C#
. . . . .
using System.ServiceModel.Web;

// サービスの実装
public class OrderService : IOrderService
{
  [WebGet(UriTemplate = "orders/{id}",
    ResponseFormat = WebMessageFormat.Xml)]
  public OrderItem GetOne(string id)
  {
    return new OrderItem
    {
      Id = int.Parse(id),
      Name = "テスト"
    };
  }
}
 

 

<OrderService.svc>

<%@ ServiceHost Language="C#" Debug="true"
  Service="WcfService1.OrderService"
  CodeBehind="OrderService.svc.cs"
  Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

 

目次

  1. はじめに
  2. 作成するアプリケーションの概要
  3. プロジェクトを作成する
  4. コントラクトを作成する
  5. サービスを実装する
  6. サービスのホスティングを構成する
  7. 実行する
  8. おわりに

1. はじめに

REST のアーキテクチャ スタイルは、URI や標準動詞 (POST、GET、PUT、DELETE) など、HTTP の仕様を強く意識したリソース ベースのアクセスを提供します。ここでは、WCF を使用した REST スタイルのサービス (RESTful サービス) の構築方法について理解します。

WCF の REST サービスでは、POX (プレーンな XML 形式)、AJAX アプリケーションなどで使用される JSON (JavaScript Object Notation)、RSS/Atom などのフィードなど、さまざまなメッセージ フォーマットのサービスを構築することが可能ですが、ここでは、簡単なサンプルとして、POX (プレーンな XML 形式) の WCF サービスを構築していきます。

ページのトップへ


2. 作成するアプリケーションの概要

ここでは、注文 ID を渡すことで、注文情報 (Order) の詳細を取得する簡単な REST サービスを作成します。

ページのトップへ


3. プロジェクトを作成する

以下の手順で、Visual Studio を起動して、新規にプロジェクトを作成します。

[ファイル] メニューの [新規作成] を選択して、[プロジェクト] をクリックします。表示される [新しいプロジェクト] ダイアログ ボックスの、プロジェクトの種類ペインで [Visual C#] ノードを展開し、[Web] をクリックします。図 1 の通り、[テンプレート] ペインでは [WCF サービス アプリケーション] をクリックします。([プロジェクト名] ボックス、[場所] ボックスには任意の名称とパスを指定してください。)

図 1. プロジェクト テンプレートを選択してプロジェクトを作成

Visual Studio で、メニュー [プロジェクト] - [参照の追加] を選択し、表示される画面で、REST サービスのランタイム ライブラリである System.ServiveModel.Web を選択して、[OK] ボタンをクリックします (図 2)。

図 2. REST サービス用の参照の追加

ページのトップへ


4. コントラクトを作成する

プロジェクトを作成すると、ソリューション エクスプローラーに IService.cs という名称のコントラクトのコードが表示されますので、これを図 3 の通り、IOrderService.cs に変更します。

図 3. サービス コントラクトの名称を変更

「IService1 への参照をすべて変更しますか」と記載されたダイアログ ボックスが表示されますので、[はい] をクリックすることで、コード内に記載された既定の IService1 の名称が IOrderService に変更されます。

コントラクトのコードを作成します。

まず、IOrderService.cs のコードを表示し、以下の通り、今回扱う OrderItem のクラスを DataContract 属性、DataMember 属性を指定して作成します。(なお、Visual Studio 2008 サービス パック 1 以降では、DataContract 属性、DataMember 属性を省略することができます。この場合、既定のデータ コントラクトが使用されます。)

C#
namespace WcfService1
{
    . . . . .

    [DataContract(Namespace = "", Name = "OrderItem")]
    public class OrderItem
    {
        [DataMember]
        public int Id;
        [DataMember]
        public string Name;
   }
}
 

上記のように、DataContract 属性の Name プロパティを設定することで、返される XML のタグを指定できます。(Name プロパティを指定しないと、既定のタグが設定されます。)

つぎに、サービスが提供するオペレーション (メソッド) として、以下の GetOne メソッドを以下の通り定義します。

C#
namespace WcfService1
{
    [ServiceContract]
    public interface IOrderService
    {
        [OperationContract]
        OrderItem GetOne(string id);
    }

    . . . . .
 

以上で、コントラクトの作成は終了です。

ページのトップへ


5. サービスを実装する

つぎに、サービスの処理を実装します。

ソリューション エクスプローラーで、既定で作成されている Service1.svc の名称を 図 4 の通り OrderService.svc に変更します。

図 4. サービスの名称を変更

プロジェクトの OrderService.svc.cs のコードを開き、以下の通り、GetOne メソッドを実装します。今回は、受け取った引数 (id) を使用して、サンプルの OrderItem オブジェクトを作成して返しています。

C#
. . . . .
using System.ServiceModel.Web;

namespace WcfService1
{
  public class OrderService : IOrderService
  {
    [WebGet(UriTemplate = "orders/{id}",
      ResponseFormat = WebMessageFormat.Xml)]
    public OrderItem GetOne(string id)
    {
      return new OrderItem
      {
        Id = int.Parse(id),
        Name = "テスト"
      };
    }
  }
}
 

上記で、WebGet 属性は、このメソッドが HTTP の GET によって取得できるメソッドであることを示しています。

また、UriTemplate によって、このメソッドに接続する URI の相対パスを示しています。例えば、サービスのベース アドレスが http://localhost/OrderService.svc で、id が 3 の OrderItem を取得する場合には、http://localhost/OrderService.svc/orders/3 で接続できます。

また、上記の ResponseFormat プロパティは、この REST サービスの戻り値のメッセージ フォーマットを表しており、今回は POX (プレーンな XML 形式) で結果を返しますが、JSON フォーマットで結果を返す場合には、この ResponseFormat プロパティを WebMessageFormat.Json に設定します。

ページのトップへ


6. サービスのホスティングを構成する

サービスのホスティングを構成します。ここでは、10 行でズバリ !! サービスの起動の自動化 (WCF の IIS ホスティング) (C#) で紹介した方法で IIS にホスティングをおこなうため、.svc ファイルと .config ファイルを構成します。

まず、Visual Studio のソリューション エクスプローラーに表示されている OrderService.svc をマウスで右クリックし、下図の通り [マークアップの表示] を選択してマークアップ コードを表示します。

図 5. OrderService.svc のマークアップを表示

マークアップ コード (OrderService.svc) に、以下を記載します。

<%@ ServiceHost Language="C#" Debug="true"
  Service="WcfService1.OrderService"
  CodeBehind="OrderService.svc.cs"
  Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

 

.svc ファイルを使用したホスティングでは、通常、既定のホスティング (WCF ランタイム ライブラリの ServiceHostFactory クラス) が内部で使用されますが、上記のように Factory として別のクラスを指定することで、専用の構成情報が組み込まれた独自のホスティングを指定することができます。ここでは、REST サービス専用の WebServiceHostFactory クラスを指定しており、REST サービスに必要な一般的な構成は、すべてこの WebServiceHostFactory クラスの中で指定されています。このため、今回は、特に追加のサービス構成 (.config の設定) をおこなう必要はありません。

Web.config を開き、下記の通り、system.ServiceModel の要素をすべて削除しておきましょう。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

. . . . .

<system.serviceModel>
<services>
<service behaviorConfiguration="WcfService1.Service1Behavior"
name="WcfService1.Service1">
<endpoint address="" binding="wsHttpBinding" contract="WcfService1.IOrderService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfService1.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

</configuration>

以上で、REST サービスの作成は完了しました。

ページのトップへ


7. 実行する

では、サービスを実行してみましょう。

Visual Studio のソリューション エクスプローラーで、.svc ファイル (OrderService.svc) をマウスで右クリックし、[ブラウザで表示] を選択すると、プロジェクトがビルドされ、Visual Studio が起動する開発サーバー (Web サーバー) が起動し、ブラウザ (Internet Explorer) が起動して、このサーバー上のページが表示されます。

図 6. サービスの実行

起動したブラウザ上で、アドレス欄に、http://[サーバーの URL]/OrderService.svc/orders/3 と入力すると (左記の [サーバーの URL] には、起動した開発サーバーのマシン名、ポート番号を入力します)、下図の通り、ブラウザ上に、OrderItem の内容がプレーンな XML として表示されます。

図 7. サービスの実行

図 7 では、返される XML の値として OrderItem のタグ名が使用されている点に注意してください。(前述の DataContract の Name プロパティで指定したタグ名が表示されます。)

また、今回は、Visual Studio が起動する開発サーバー上でサービスをホスティングしていますが、10 行でズバリ !! サービスの起動の自動化 (WCF の IIS ホスティング) (C#) で紹介したように、IIS にホスティングをおこなうことも可能です。

ページのトップへ


8. おわりに

今回は、ブラウザを使用して REST サービスに接続しましたが、このサービスにプログラムから接続するには、通常の Web サーバーへのアクセスで使用される HttpWebRequest (または WebClient) クラスなどの .NET のクラスを使用したり、jQuery などの JavaScript のライブラリを使用してブラウザ上からアクセスことが可能です。

Note: Visual Studio 2010 以降をお使いの方は、REST サービスを作成するためのさらに便利なプロジェクトテンプレートを拡張機能 (アドイン) として利用できます。(従来、CodePlex (英語) で「WCF REST Starter Kit」として提供されていた機能です。)
このアドインを使用するには、Viusual Studio で [ツール] - [拡張機能マネージャー] を選択して、表示される画面で下図のプロジェクトテンプレート (それぞれ、.NET Framework 3.5 用、.NET Framework 4 用です) を追加します。

これらのプロジェクト テンプレートを使用すると、REST に準じた厳密な HTTP ステータスの設定 (例えば、「作成」が成功した場合は、ステータス 201 を返す必要があります)、ヘルプページやエラー ハンドリングの提供、AtomPub への対応など、さまざまな処理が提供されており、プログラマーの皆さんは、こうした煩雑な処理をより簡単に実装することができます。


Code Recipe .NET Framework デベロッパー センター

ページのトップへ