Azure Mobile Apps - 2015 年 9 月の更新情報

このポストは、9 月 22 日に投稿された Azure Mobile Apps September 2015 Update の翻訳です。

 

今回は、Matthew Henderson と共同執筆した記事をご紹介します。

このたび、Azure Mobile Apps 用 .NET Server SDK の最新版が発表されました。Web とモバイルの統合エクスペリエンスの概要については先月のブログ記事 (英語) でご紹介していますので、そちらもぜひご一読ください。

今回の .NET Server SDK バージョン 0.2.575 には複数の更新が追加されています。

  • (新規!) Azure Table Storage をサポート
  • (重大な変更) ASP.NET との統合を強化するために OWIN の自動セットアップを廃止
  • (重大な変更) 認証ミドルウェアのセットアップを強化
  • (重大な変更) データベース スキーマのセットアップの既定値を改善
  • (重大な変更) システム プロパティが既定で送信されるようになり、クライアント側での要求が不要に

Microsoft.Azure.Mobile.Server.Quickstart (英語) NuGet パッケージをインストールすると、上記の更新を手軽に導入できるほか、その他の依存関係を取り込むことができます。また、必要に応じて、特定の Microsoft.Azure.Mobile.Server.* パッケージも入手可能です。

 

Azure Storage

新しい Microsoft.Azure.Mobile.Server.Storage パッケージをインストールして、Azure Table Storage を TableController のバッキング データ プロバイダーとして使用できるようになりました。

Storage に接続するには、TableController の Initialize() メソッドに以下のスニペットを追加します。

 DomainManager = new StorageDomainManager(connectionStringName, tableName, Request);

上記の connectionStringName は Storage への接続文字列のアプリ設定キー、tableName はアクセスする Table の名前を表します。多くの場合、これにはコントローラーの名前 (controllerContext.ControllerDescriptor.ControllerName.ToLowerInvariant() ) が使用されます。

StorageDomainManager の動作は EntityDomainManager とは若干異なり、実装する TableController ヘルパー メソッドのサブセットも異なります。たとえば、TableController の「Get」メソッドは以下のようになります。

 public Task<IEnumerable<TodoItem>>GetAllTodoItems(ODataQueryOptions queryOptions)
{
    return QueryAsync(queryOptions);
}
public Task<SingleResult<TodoItem>>GetTodoItem(string id)
{
    return LookupAsync(id);
}

Mobile Apps のクライアント SDK は、すべてこの Table Storage のドメイン マネージャーと連携します。ただし、iOS クライアントでは、現時点で StorageDomainManager を使用した Table コントローラーに対するオフライン同期はサポートされていません。

 

OWIN のスタートアップ

.NET Server SDK で OWIN ミドルウェアを使用する方法はいくつか存在します。これまで Microsoft.Azure.Mobile.Quickstart パッケージには、一部のコンポーネントどうしを自動的に接続する OWIN スタートアップ クラスが含まれていました。

これは便利ではありましたが、動作のカスタマイズが困難で、既存のアプリに簡単に統合することができませんでした。そのため今回の更新では、Quickstart パッケージからこのスタートアップ クラスを削除するという重大な変更を行いました。

以前のバージョンの Quickstart パッケージをアップグレードするには、新しいスタートアップ クラスを追加して、そこに構成を移動させる必要があります。

  1. Visual Studio でプロジェクトを右クリックして、[Add]、[New Item] の順に選択します。その後、[Web]、[General]、[OWIN Startup class] の順に選択します。
  2. MobileAppConfiguration のコードを WebApiConfig.Register() から新しいスタートアップ クラスの Configuration() メソッドに移動します。Global.asax から渡されたグローバルな HttpConfiguration の代わりに新しい HttpConfiguration を作成する場合は、メソッドの最後に app.UseWebApi(config) を呼び出します。

また、Azure 管理ポータルで提供されているサーバー クイックスタート プロジェクトをベースとして独自のプロジェクトを開始することもできます。

 

OWIN ミドルウェア

今回の更新では、よりスムーズに認証を行えるように、すべての認証コンポーネントが独自の OWIN ミドルウェアに含まれるようになりました。これにより、開発者が認証をさらに細かく制御できるようになったほか、SignalR のルートなど、あらゆる種類の ASP.NET アプリに Mobile Apps の認証コンポーネントを統合できるようになりました。

大きな変更点: MobileAppConfiguration.AddAppServiceAuthentication() メソッドは削除され、今後不要となります。

認証を使用するには、OWIN スタートアップ クラスに以下の呼び出しを追加してください。

 app.UseMobileAppAuthentication(config);

上記の config は、グローバルな HttpConfiguration または Web API OWIN のセルフホストに使用している HttpConfiguration のいずれかを表します。認証のセットアップに関する詳細については、資料の「方法: サーバー プロジェクトに認証を追加する」をご覧ください。

 

データベース スキーマ

.NET Server SDK では、これまで Entity Framework をセットアップする際に既定のスキーマ名としてモバイル アプリ名を使用していましたが、お客様からは「dbo やカスタムのスキーマ名を使用することが多いので、この既定値はあまり役に立たない」というご意見が寄せられていました。

そこで今回の更新では、.NET Server SDK の Quickstart パッケージでも Entity Framework と同様に dbo を既定のスキーマ名として使用します。別のスキーマ名を使用する場合は、DbContext.OnModelCreating() 実装で指定してください。

 modelBuilder.HasDefaultSchema(schema); // スキーマ文字列を指定します

この変更の一環として、MS_TableSchema (スキーマが存在する場合) または MS_MobileServiceName(存在しない場合) のアプリ設定を使用する MobileAppSettingsDictionary.GetSchemaName() が削除されました。

(注: 前回の Server SDK の更新で、ServiceSettingsDictionary クラスは MobileAppSettingsDictionary に名称が変更されています。)

大きな変更点: GetSchemaName() メソッドを使用する場合は、以下のように変更します。

 // string schema = MobileAppSettingsDictionary.GetSchemaName(); // メソッドは削除されました

// MS_MobileServiceName のアプリ設定が存在することを確認します
string schema = System.Configuration.ConfigurationManager.AppSettings.Get("MS_MobileServiceName");

注: Quickstart プロジェクトでは、web.config に MS_MobileServiceName の設定が追加されなくなりました。そのため、スキーマ名に独自のキーを作成し、そのキーを web.config または Azure 管理ポータルの [App Settings] ブレードで指定することをお勧めします。

 

システム プロパティ

これまでは、サーバーに __systemProperties=* のクエリが送信された場合にのみ、 __createdAt__updatedAt__version__deleted のシステム プロパティがクライアントに送信されていました。Mobile Services では、この動作は下位互換性を維持するために必要でしたが、これにより、クライアント SDK のテストや開発を行うのが困難になっていました。

今回のリリースでは、クエリ文字列 __systemProperties は無視され、常にシステム プロパティが返されるようになりました。 $select を使用して特定の列を取得する場合は、$select 句にシステム プロパティを追加します。$select が指定されていなければ、システム プロパティを含むすべてのプロパティが返されます。

大きな変更点: ほとんどの場合、クライアント SDK の動作が変わることはありません。ただし、以下の場合には注意が必要です。

  • iOS と JavaScript クライアントでオンラインの Table API を使用した場合に、更新または削除の操作を実行すると、既定で __version フィールドがサーバーに送信されます。同時更新の競合処理のサポートが不要な場合 (オプティミスティック同時実行) は、更新を実行する前にクライアント オブジェクトからこのフィールドを削除する必要があります。オフライン同期 API への影響はありません。
  • クライアントを問わず、クエリに $select__systemProperties の両方が含まれる場合、 $select 句で指定されたシステム プロパティのみが返されます。そのため、必要なシステム プロパティが $select 句に含まれるようにクエリを変更する必要があります。

Mobile Apps は引き続きプレビュー版での提供となりますが、今回の更新をお試しいただければ幸いです。ご意見、ご感想がございましたら、コメント欄、MSDN のフォーラム (英語)、Twitter アカウント (@AzureMobile) までお寄せください。また、この製品に追加してほしい機能がありましたら、フィードバック用サイト (英語) からお知らせください。

SDK に対する変更点は、今後もこちらのブログでご紹介するほか、.NET Server SDK の変更ログ (英語) でもお知らせする予定です。