はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Windows Azure Mobile Serviceのバックエンドを.NET言語で実装する

「日本(東)」と「日本(西)」がオープンしてにぎやかなAzure界隈で、そんな喧騒に隠れてしまっていますがMobile Serviceのバックエンドが従来のJavaScriptに加えて(プレビュー版ですが)VB.NET/C#でも記述できるようになりました。

image

 

バックエンドに「.NET(プレビュー)」を選択すると、従来はあった「データ」と「API」が表示されません。

image

これは初期テーブルも含めてすべてコード側で記述できるために、管理ポータルからはその機能がなくなっていることを意味します。

 

そのことは、新規にWindowsストアアプリを作成する手順の中にも「テーブルを作成する」という手順がないことからもわかります。

image

 

手順2の「ダウンロード」からサンプルプロジェクトをダウンロードして内容を見てみると、「.NET」バックエンドがどのように実現されるのが一目瞭然です。

image

dotNETBackendプロジェクトがWindowsストアアプリのプロジェクト、dotNETBackendServiceがASP.NET Web APIプロジェクトになっています。

 

このASP.NET Web APIプロジェクトをAzureに発行することでMobile Serviceとして動作するようになります。

内部的にはEntityFrameworkが使われていて、「Microsoft.Owin.Security.Facebook」クラスライブラリなど認証系のクラスライブラリもFacebookGoogle、MicrosoftAccount、Twitterと一揃いそろっています。またMongoDBとの接続用のクラスライブラリなども含まれていました。

 

ASP.NET Web APIプロジェクトをAzureに発行するためには、管理ポータルの手順3からあらかじめ発行プロファイルをダウンロードしておけば、それを指定するだけで簡単にできます。

image

デプロイが成功しても管理ポータル的には何も変化しません。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を指定したところのコメントを外してください。

image

 

ストアアプリが起動しただけで「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には次のような定義のテーブルが自動生成されてデータが格納されます。

image

Text、Completeは明示的に指定した項目ですが、その他の項目は動作するために必要な管理情報になります。

 

なお、どうやってASP.NET Web APIが接続先のAzure SQL Databaseを指定しているのかわからなかったのですが、発行プロファイルの中にある.pubxmlの中で「MS_TableConnectionString」にAzure SQL Databaseの接続文字列を設定していました。

 

現状、アクセス権はアプリケーションキーを指定になっていますので、次回はアクセス権の変更についてしらべたいと思います。