「日本(東)」と「日本(西)」がオープンしてにぎやかなAzure界隈で、そんな喧騒に隠れてしまっていますがMobile Serviceのバックエンドが従来のJavaScriptに加えて(プレビュー版ですが)VB.NET/C#でも記述できるようになりました。
バックエンドに「.NET(プレビュー)」を選択すると、従来はあった「データ」と「API」が表示されません。
これは初期テーブルも含めてすべてコード側で記述できるために、管理ポータルからはその機能がなくなっていることを意味します。
そのことは、新規にWindowsストアアプリを作成する手順の中にも「テーブルを作成する」という手順がないことからもわかります。
手順2の「ダウンロード」からサンプルプロジェクトをダウンロードして内容を見てみると、「.NET」バックエンドがどのように実現されるのが一目瞭然です。
dotNETBackendプロジェクトがWindowsストアアプリのプロジェクト、dotNETBackendServiceがASP.NET Web APIプロジェクトになっています。
このASP.NET Web APIプロジェクトをAzureに発行することでMobile Serviceとして動作するようになります。
内部的にはEntityFrameworkが使われていて、「Microsoft.Owin.Security.Facebook」クラスライブラリなど認証系のクラスライブラリもFacebook、Google、MicrosoftAccount、Twitterと一揃いそろっています。またMongoDBとの接続用のクラスライブラリなども含まれていました。
ASP.NET Web APIプロジェクトをAzureに発行するためには、管理ポータルの手順3からあらかじめ発行プロファイルをダウンロードしておけば、それを指定するだけで簡単にできます。
デプロイが成功しても管理ポータル的には何も変化しません。Mobile Serviceが使っているSQL Databaseにもテーブルは作成されません。なぜならば、デプロイされただけでASP.NET Web APIとしては初回動作が行われていないからです。
よって、Windowsストアアプリのプロジェクトをスタートアッププロジェクトにして実行してはじめてテーブルがつくられます。
この時注意しなくてはならないのは、解凍した時のコードでは接続するWeb APIはローカル開発環境上のIIS Expressで実行されるASP.NET Web APIプロジェクトだという点です。App.Xaml.csの「http://localhost:58713」を指定したMobileServiceClientの生成部分をコメントアウト削除して、その下でコメントアウトされているMobile ServiceのURLを指定したところのコメントを外してください。
ストアアプリが起動しただけで「First Item」と「Second Item」が表示されますが、これは、ASP.NET Web API側の「WebApiConfig.cs」がglobal.asax.csのApplication_Startで呼び出されて、その中で次のコードが初回のみ実行されるからです。
public class dotNETBackendInitializer : DropCreateDatabaseIfModelChanges{ protected override void Seed(dotNETBackendContext context) { List<todoitem> todoItems = new List<todoitem> { new TodoItem { Id = "1", Text = "First item", Complete = false }, new TodoItem { Id = "2", Text = "Second item", Complete = false }, }; foreach (TodoItem todoItem in todoItems) { context.Set<todoitem>().Add(todoItem); } base.Seed(context); } }
この操作によりSQL Databaseには次のような定義のテーブルが自動生成されてデータが格納されます。
Text、Completeは明示的に指定した項目ですが、その他の項目は動作するために必要な管理情報になります。
なお、どうやってASP.NET Web APIが接続先のAzure SQL Databaseを指定しているのかわからなかったのですが、発行プロファイルの中にある.pubxmlの中で「MS_TableConnectionString」にAzure SQL Databaseの接続文字列を設定していました。
現状、アクセス権はアプリケーションキーを指定になっていますので、次回はアクセス権の変更についてしらべたいと思います。