なか日記

一度きりの人生、楽しく生きよう。

ASP.NET Core MVCでTempData(Session)を使用する

趣味でいじるなら~とASP.NET Coreをちょっとだけ触ろうとしたのですが、速攻つまずきました。

TempDataを使いたくて以下のように書いたのですが、

  public async Task<IActionResult> Index()
  {
    TempData["Hoge"] = "Fuga";

    return View();
  }

Sessionが設定されてないでぇと例外がスローされちゃいました。

f:id:nakaji999:20160616050856p:plain

TempDataが使用しているSessionに関する機能が標準ではインストールされてないようなので、下のように設定する必要があります。

パッケージをインストール

今までのようにパケージマネージャーコンソールから、パッケージをインストールします。

Install-Package Microsoft.Extensions.Caching.Memory -pre
Install-Package Microsoft.AspNetCore.Session -pre

今はrc2ですが、rc1の時とパッケージ名が微妙に変わっている*1ので注意が必要です。

project.jsonを編集

もしくは、project.jsonを編集するのでもいいみたいです。

{
  "dependencies": {
    ~略~
    "Microsoft.AspNetCore.Session": "1.0.0-rc2-final",
    "Microsoft.Extensions.Caching.Memory": "1.0.0-rc2-final"
  },

お作法的にはどっちが正解なんでしょうね?個人的にはNuGetにお任せしたい感じ。

Startup.csでサービスを追加

Startup.csでSessionを使用すること、情報の格納先(キャッシュ)にメモリーを使用することを宣言します。

  public void ConfigureServices(IServiceCollection services)
  {
    // AddMvcする前でもどこでも
    services.AddMemoryCache();
    services.AddSession();

    // Add framework services.
    services.AddMvc();
  }

  public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  {
    ~略~

    // UseMvcする前に書く
    app.UseSession();

    app.UseMvc(routes =>
    {
      routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
    });
  }

メモリー以外のキャッシュ

今回はSessionの格納先にメモリー(Microsoft.Extensions.Caching.Memory)を選択しましたが、それ以外にもRedisやSQLServerなんかも使えます。

SQLServer使う時の事は下のブログに書いてありそうな気がします。

参考情報

*1:rc1ではMicrosoft.AspNet.Session