しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET MVC 5.2 で Facebook アプリテンプレートが使えない問題と対応法

Visual Studio 2013 Update 1 でも ASP.NET プロジェクトを作成する時に、Facebook を選択すると Facebook アプリのテンプレートが作られます。

f:id:shiba-yan:20140729185324p:plain

しかし、このテンプレートに対して MVC 5.2 などにアップデートしようとすると、Microsoft.AspNet.Mvc.Facebook の依存関係によってアップデートに失敗してしまいます。

f:id:shiba-yan:20140729185350p:plain

ぶっちゃけパッケージメタデータだけの問題で、互換性には問題ないはずなので対応が行われると思っていましたが、ちょっと前に以下のような記事が投稿されました。

Updating the MVC Facebook API - .NET Web Development and Tools Blog - Site Home - MSDN Blogs

要約すると Facebook の Graph API 2.0 対応を行うためのアップデートが行われたようです。Graph API 2.0 に対応した関係上、今までのアプリケーションとは互換性が無くなっています。

ASP.NET Facebook を使う

残念ながら Microsoft.AspNet.Mvc.Facebook は更新が行われないようなので、Graph API 2.0 で問題ない場合には Microsoft ASP.NET Facebook こと Microsoft.AspNet.Facebook という新しいパッケージを使うようにして対応しましょう。

NuGet で以下のコマンドを打ち込めば、新しいパッケージをインストールすることが出来ます。

Uninstall-Package Microsoft.AspNet.Mvc.Facebook.ja
Uninstall-Package Microsoft.AspNet.Mvc.Facebook

Install-Package Microsoft.AspNet.Facebook

新しいパッケージは今までとは異なり、バージョンが 1.0.0 となっているので少しだけ注意。

f:id:shiba-yan:20140729185411p:plain

あと、名前空間が新しくなっているので、そのままビルドするとエラーになります。

f:id:shiba-yan:20140729185418p:plain

名前空間の変更点は Mvc が無くなっただけなので、一括置換などで対応が可能だと思います。

//using Microsoft.AspNet.Mvc.Facebook;
using Microsoft.AspNet.Facebook;

これで問題ない気がしますが、これからは Graph API の仕様変更と戦う必要があります。例えば 2.0 では友達リストを取得するためには user_friends 権限を追加する必要があるので、アクションの修正を行います。

// user_friends を追加する
[FacebookAuthorize("email", "user_photos", "user_friends")]
public async Task<ActionResult> Index(FacebookContext context)
{
    if (ModelState.IsValid)
    {
        var user = await context.Client.GetCurrentUserAsync<MyAppUser>();
        return View(user);
    }

    return View("Error");
}

とりあえずはこれでユーザーの情報や写真が取れるようになります。

f:id:shiba-yan:20140729231210p:plain

しかし、友達一覧が出ていないのでアプリとして破綻気味ですね。残念なことに Graph API 2.0 では、このアプリに参加している友達の情報しか取れなくなったようなので空っぽになっています。

ASP.NET Facebook パッケージよりも Graph API 2.0 の変更内容の方が致命的なので、既存のアプリケーションは MVC 5.2 にアップデートするのは困難な気がしました。*1

*1:メタデータ弄って依存関係を変えてしまうという裏技は有り