はじめに
前回 まではiOSデバイス+Windows Azureプラットフォームの開発における、技術概要と開発環境の構築についてご紹介しました。今回から、実際にAzureサービスとiOSアプリケーションとの開発を始めていきたいと思います。今回はWebロール上で動作させるサービスの開発を行いたいと思います。
Windows Azureのサービス開発における環境構築については、第2回の記事を参考にして、行ってください。本記事では、Visual Studio 2010を使用して開発内容を説明していきます。第2回で紹介したとおり、Visual Web Developer 2010 Expressでも開発可能です。以降、Visual Studioと表記しますので、適宜環境に合わせて読み替えてください。
作成するサービスの概要
今回の例として作成するのは、ユーザが星座を指定してカードを引くという、星座占いもどきのサービスです。サービスを呼び出すと、ランダムにカードを返すメソッドを実装します。iOSデバイスから扱いやすいように、エンティティはJSONで、インターフェースはRESTにします。
プロジェクトのセットアップ
今回作成するサービスは、Windows AzureのWebロールをターゲットとします。開発はWindows Azureエミュレーション環境で行います(第2回の環境構築にこちらも含まれています) 。
Visual Studioを(Vista以降では管理者権限で)起動したらテンプレートからプロジェクトを生成します。メニューの「ファイル(F)」の「新しいプロジェクト…(P)」でダイアログが開きます。左のリストから「インストールされたテンプレート」の「Visual C#」を展開して、「 Cloud」を選択します。中央リストに表示された「Windows Azure Project」を選んで、プロジェクト名を名前のテキストボックスに入力します。ここでは「GihyoiOSAzureSample1」とします。[ OK]ボタンをクリックすると、次に[New Windows Azure Project]ダイアログが開きます。左のリストから「WCF Service Web Role」を選択して、[ >]ボタンで追加して、[ OK]ボタンでプロジェクトが生成されます(図1 ) 。
図1 Webロールの選択
ソリューションにAzureプロジェクトの「GihyoiOSAzureSample1」と「WCFServiceWebRole1」があります。後者のプロジェクトの名を変更しておきます。今回は占いをモチーフにしたサービスを作るので、「 DivinationWebRole」としましょう。さらに、このプロジェクトの項目の直下に、「 Service」と「Entity」フォルダを作成しておきます。いずれの操作も「ソリューションエクスプローラー」で、プロジェクトの項目のコンテキストメニュー経由で実行できます。プロジェクト名を変更したら、続けてプロジェクトのプロパティから、[ アセンブリ名]と[既定の名前空間]も同様に「DivinationWebRole」に変えておきます。
エンティティの追加
JSONで表現する“ カード” のエンティティクラスを作成します。作成した「Entity」フォルダを選択してコンテキストメニューから[追加 (D)]の[新しい項目の追加…(W)]を選びます。[ 新しい項目の追加]ダイアログでテンプレートのWebから「クラス」を選択します。名前に「Card.cs」を入力して、[ 追加(A)]をクリックして追加します。
Card.csは下記のとおりにします。
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace DivinationWebRole.Entity
{
[DataContract]
public class Card
{
[DataMember(Name = "rank")]
public int Rank { get; set; }
[DataMember(Name = "desc")]
public string Description { get; set; }
}
}
DataContract属性をクラスに、プロパティにDataMember属性を追加します。JSONのキーになるので、Nameを小文字にしてセットしています。
サービスの作成
先ほど、作成した「Service」フォルダを選択してコンテキストメニューから[新しい項目の追加]ダイアログを開き、テンプレートのWebから「AJAX対応WCFサービス」を選択して(図2 ) 、サービス名を「DivineService.svc」として、[ 追加(A)]ボタンで閉じます。
そうすると自動的に、Visual Studio上で追加作成されたDivineService.svcのコードが開きます。
図2 Ajax対応WCFサービスの選択
DoWorkメソッドをDivineメソッドに変えて処理を、下記のとおり実装してみます。Divineメソッドは、zodiac引数に星座を表す文字列を受け取り、それを用いて、CardクラスのDescriptionプロパティをセットします。Rankプロパティにはランダムに1~10の整数をセットします。
Using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
namespace DivinationWebRole.Service
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DivineService
{
[OperationContract]
[WebGet(UriTemplate = "card/{zodiac}",
ResponseFormat = WebMessageFormat.Json)]
public Entity.Card DrawCard(string zodiac)
{
var random = new Random();
var card = new Entity.Card();
card.Rank = random.Next(10) + 1;
card.Description = "This is a sample " + zodiac + " Card.";
return card;
}
}
}
WebGet属性のUriTemplate値は、REST仕様のURLパス適用を定義するものです。
UriTemplateを使用するには、Web.configのビヘイビア(behavior)定義を変更する必要があります。Web.configを開いて、<behavior name="DivinationWebRole.Service.DivineServiceAspNetAjaxBehavior">内の<enableWebScript />を<webHttp/>に置き換えます。
<behavior name="DivinationWebRole.Service.DivineServiceAspNetAjaxBehavior">
<webHttp />
</behavior>
開発環境でのテスト実行
「DivineService.svc」のコンテキストメニューから[ブラウザーで表示(B)]でサービスが起動し、Internet Explorerが開かれます。
URLは「http://localhost:<ポート>/Service/DivineService.svc」となって、WSDLを使ったクライアントの生成の説明が表示されています(図3 ) 。
図3 サービスのページ
ここでURLパスの末尾に実装したDivineメソッドのパス「card/leo」にアクセスします。
ブラウザーで「http://localhost:<ポート>/Service/DivineService.svc/card/leo」にアクセスすると、JSONでCardクラスの内容が返ります。テキストエディタで開くと、下記のように表示されます。「 leo」の部分はパスの値が入り、「 7」の値はランダムになります。
{"desc":"This is a sample leo Card.","rank":7}
今回紹介したサンプルコードはこちら からダウンロードできます。
最後に
本記事では、Windows Azureサービスを一般的なWebロール用にWCFベースでC# .NETで作成してみました。次回以降は、今回作成したサービスをクラウドに配備して、 サービスにアクセスするiOSアプリケーションの開発を進めていきたいと思います。
再びのご紹介になりますが、Windows Azure プラットフォームは無料で試すことができます。MSDNサブスクリプション会員であれば、さらに相当量の利用が無償で使用できます。これを機会に試してみては、いかがでしょうか。