CodeZine(コードジン)

特集ページ一覧

Visual Studio 2008で標準搭載されたWindows Communication Foundation

Visual Studio 2008 徹底入門 (7)

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

サンプル2:RESTスタイルのWebサービス

 SOAPベースのWebサービスは、厳密なXML定義を扱う関係上、前項のサンプル作成を見ても分かるとおり、クライアント実装においてもそれなりの手順を踏む必要があります。Visual Studioを使って参照クラスを自動生成すれば手順は簡略化できますが、Ajaxなどで簡単にアクセスするには敷居が高いと言えます。開発者としても、ブラウザで簡単に内容を確認できないのは歯痒いところです。

 こうした問題点を受け、近年のWebサービスの潮流は、SOAPベースのものから、データを抽象化せず、直接XMLを扱うRESTスタイルのサービスへと向かいつつあります。

 では、.NET Framework 3.5でサポートされたWebプログラミングモデルを使い、RESTスタイルのWebサービスを作成してみましょう。

変更の流れ

 SOAPベースのWebサービスから、RESTスタイルのWebサービスに変更するには、以下の手順を踏みます。

  1. エンドポイントの設定変更
  2. まず、バインディングをSOAPベースのbasicHttpBindingから、WebプログラミングモデルのwebHttpBindingに変更します。また、サービスビヘイビアとして、Webプログラミングモデルに必要なwebHttpというビヘイビアを追加します。
     
  3. HTTP GETのURIテンプレート指定
  4. RESTスタイルのWebサービスの場合、クライアントはHTTP GETを使ってリクエストを行います。その際に、パラメータをURIのどの部分で表すかをテンプレートとして記述します。

エンドポイントの設定変更

 まずはABCの書き換えです。Microsoft Service Configuration Editorを起動し、WcfServiceTestプロジェクトのWeb.configファイルを開きましょう。

 左上のConfigurationペインで[Advanced]-[Endpoint Behaviours]をクリックし、右上の[New Endpoint Behaviour Configuration]をクリックします。

エンドポイント・ビヘイビアの追加
エンドポイント・ビヘイビアの追加

 [Add]ボタンを押し、ビヘイビア一覧ダイアログから[webHttp]を選択して[Add]ボタンを押します。

webHttpビヘイビアの追加
webHttpビヘイビアの追加

 左上のConfigurationペインで[Services]-[WcfServiceTest.Service1]-[Endpoints]-[(Empty Name)]の下のアイテムをクリックします。ちなみに上のアイテムは前述のメタデータ交換用のエンドポイントです。

 右ペインの[Behaviour Configuration]に先ほど作成したwebHttpBehaviorを、[Binding]にwebHttpBindingを指定します。

エンドポイント設定変更
エンドポイント設定変更

 これで、エンドポイントをSOAPベースからRESTスタイルのWebサービスに切り替えることができました。

HTTP GETのURIテンプレート指定

 SOAPベースのWebサービスの場合、サービスのパラメータはPOSTで指定しますが、RESTスタイルのWebサービスの場合は、パラメータをHTTP GETリクエストのURIの中で指定します。従って、パラメータをURIでどのように表現するか(URIのテンプレート)を定義する必要があります。これはコントラクトと同様に属性として、ソースコード中に付加します。

 次のように、公開するメソッドにWebGet属性を追加し、UriTemplateプロパティに引数名を{}に含める形でURIを記述します。

WebGet属性の追加
[OperationContract]
[WebGet(UriTemplate = "Hello?name={name}")]
string GetMessage(string name);

[OperationContract]
[WebGet(UriTemplate = "GetAddressBook/{id}")]
AddressBookEntry GetAddressBookEntry(string id);

 WebGet属性のUriTemplateプロパティで指定したURIは、そのサービスのAddressの後に付加されます。

 従って、今回のAddressは

http://localhost/WcfTest/Service1.svc

 ですので、その後にURIテンプレートを付加した

http://localhost/WcfTest/Service1.svc/Hello?name=doi

 というアクセスは

IService1.GetMessage("doi")

 という形式でメソッドを呼ぶことに対応します。

 同様に

http://localhost/WcfTest/Service1.svc/GetAddressBookEntry/1

 というアクセスは

IService1.GetAddressBookEntry("1")

 という形式でメソッドを呼ぶことに対応します。

 URIテンプレートにおいて、パスなどは自由に使用することができますので、それぞれの処理に意味のあるURIを割り当てることができます。今回は引数をクエリストリングやパスとして表現しました。

サンプル実行

 では、再度IISへの発行を行い、実行してみましょう。

http://localhost/WcfTest/Service1.svc/Hello?name=doi
GetMessageの呼び出し結果
GetMessageの呼び出し結果
http://localhost/WcfTest/Service1.svc/GetAddressBookEntry/1
GetAddressBookEntryの呼び出し結果
GetAddressBookEntryの呼び出し結果

 それぞれの結果が、直接XMLで表示されていることに注目してください。型名がルート要素となり、それ以下にフィールドが並んでいます。

 こうしたシンプルなXMLであれば、クライアントでのパースも楽に行うことができるでしょう。

 SOAPベースのWebサービスからRESTスタイルのWebサービスに書き換えるまで、ほんのわずかな手順しか掛からなかったことに注目してください。HTTP GETのURIテンプレートを記述する、という少しの手間以外は、ABCを書き換えるだけで切り替えを行うことができました。

サンプル3:JSONサポート

 では、さらに対応形式を変えてみましょう。Ajaxで頻繁に使用されるJSON形式です。JSONはWebブラウザ上のJavaScriptで、文字列としてパースする必要がなく、直接扱うことのできるテキストベースのデータエンコード形式です。前述の通り、.NET Framework 3.5から、WCFでもJSONがサポートされるようになりました。

 JSONはRESTスタイルのWebサービスと同様、WCFのWebプログラミングモデルでサポートされており、バインディングは共通のwebHttpBindingを使用します。従って、ABCの変更は不要で、ごくごくわずかな設定の書き換えだけでJSONサポートを行うことができます。

WebGet属性の書き換え

 JSONサポートに必要なのは、WebGet属性のResponseFormatプロパティを指定する、ただそれだけです。

 次のように、「IService1.cs」内のサービス・コントラクトのWebGet属性に、ResponseFormatとしてWebMessageFormat.Jsonを指定します。

WebGet属性の書き換え。ResponseFormatプロパティの追加
[OperationContract]
[WebGet(UriTemplate = "/Hello?name={name}",
 ResponseFormat = WebMessageFormat.Json)]
string GetMessage(string name);

[OperationContract]
[WebGet(UriTemplate = "/GetAddressBook/{id}",
 ResponseFormat = WebMessageFormat.Json)]
AddressBookEntry GetAddressBookEntry(string id);

 以上で書き換えは終了です。

JSONサポート確認

 では、再度IISへの発行を行い、実行してみましょう。

 それぞれ、次のような結果が返ってきます。

http://localhost/WcfTest/Service1.svc/Hello?name=doi
GetMessage(”doi”) 呼び出し結果
"Hello doi!"
http://localhost/WcfTest/Service1.svc/Hello?name=foo
GetMessage(”foo”) 呼び出し結果
"Hello foo!"
http://localhost/WcfTest/Service1.svc/GetAddressBookEntry/1
GetAddressBookEntry(”1”) 呼び出し結果
{"Address":"Tokyo","Id":1,"Name":"Doi"}
http://localhost/WcfTest/Service1.svc/GetAddressBookEntry/2
GetAddressBookEntry(”2”) 呼び出し結果
{"Address":"?","Id":0,"Name":"Anonymous"}

 文字列を返すだけのGetMessageではよく分かりませんが、GetAddressBookEntryの結果を見ると、フィールドと値が:や,で区切られた、JSON形式で正しく出力されていることが分かります。

 切り替え所要時間は数十秒、といったところでしょうか。REST化以上にJSON化は簡単だったことが実感できたかと思います。

ASP.NET AJAXによるWCF連携
 ASP.NET AJAXからWCFのサービスにアクセスする方法については、本連載の第4回でも紹介しています。併せて参照してください(2008年3月中旬 公開予定)。

まとめ

 WCFの概念と、Visual Studio 2008を使ったWebサービスの構築、RESTスタイルのWebサービス・JSONサポートについて、概観することができました。WCFの機能は非常に大きく、1つの記事ですべて説明することはできませんが、ここで基本的な概念を掴むことができましたので、他の通信方式や、さまざまなビヘイビアなどを扱う場合にも、MSDNのドキュメントを参照しながら理解を進めていけるでしょう。

 実のところ、Visual Studio 2005+ExtensionsとVisual Studio 2008のWCFサポートは、特別な機能差はありません。これは、Visual Studio 2005+Extensionsの時点でMicrosoft Service Configuration Editorが組み込まれており、既に実装に十分な機能を提供していたためです。しかし、.NET Framework 3.5でWCFに加えられた機能は非常に強力で、これまでWCFを使うことのなかった、より多くの開発者が、RESTスタイルのWebサービスやJSONサポートなどの機能を使うため、WCFベースのWebサービス実装に取り組むことになります。そうした際に、.NET Framework 3.5とWCFを標準サポートしたVisual Studio 2008は、心強い味方となってくれることでしょう。

 .NET Framework 3.0のWCFでは、通信方式を簡単に切り替えられる、共存できると言っても、現実的なユースケースが正直想像しづらかったのですが、.NET Framework 3.5のWCFでは、SOAPベースのWebサービス・RESTスタイルのWebサービス・JSON形式などを混在させながら同時に提供するなど、WCFがもともと持っていたポテンシャルを存分に発揮できるようになりました。今後さらに新しいデータの表現形式が出てきたとしても、WCFベースのサービスを構築しておけば、WCFでサポートされた時点ですぐに対応できます。あるいは新しいバインディングを開発すれば、WCFのバージョンアップを待つことなく、新しい形式に対応することもできます。Visual Studio 2008で正式にサポートされた強力な通信フレームワークであるWCFに、この機会にぜひ取り組んでみてください。

 次回は、.NET Framework 3.0から導入されたワークフローフレームワークであるWFについて、Visual Studio 2008でどのように利用できるかを特集します。

参考資料

 


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

バックナンバー

連載:Visual Studio 2008徹底入門

もっと読む

著者プロフィール

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、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