ASP.NET Core MVC - Sessionを使う

ASP.NET Core MVCの勉強の記録です。

いつものごとくDocsを参考にして、今回はセッションを使ってみたいと思います。

ASP.NET Core でのセッションとアプリの状態 | Microsoft Docs

Startupクラスでセッションを構成する

まずはセッションを使えるようにします。

Startup.ConfigureServicesメソッドでAddSessionメソッドを呼び出して、ConfigureメソッドではUseSessionメソッドを呼び出します。

public class Startup {
    public void ConfigureServices(IServiceCollection services) {
        // いらないのかも
        //services.AddDistributedMemoryCache();

        // セッションを使う
        services.AddSession(options => {
            // セッションクッキーの名前を変えるなら
            options.Cookie.Name = "session";
        });

        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
        // パイプラインでセッションを使う
        app.UseSession();

        app.UseMvcWithDefaultRoute();
    }
}

検索すると見つかるサンプルには、ConfigureServicesメソッドでDistributedMemoryCacheを足しているものがありますが、今は不要かもしれません。 どうもAddMvcメソッドの中で追加されるっぽいです。

セッションの読み書き

セッションに対して読み書きするには、HttpContext.Sessionプロパティ(型はISession)経由で行います。

セッションに数値や文字列を格納する場合は、設定・取得する拡張メソッドが用意されています。こちらを使いましょう。

// 文字列の場合
// SetStringとGetStringの拡張メソッドを使うのに必要
using Microsoft.AspNetCore.Http;

// セッションに文字列を書き込む(キーは"key")
HttpContext.Session.SetString("key", "Hoge");

// セッションから文字列を読み込む
HttpContext.Session.GetString("key");

セッションにオブジェクトを読み書きする

セッションにオブジェクトを格納するにはどうするの?と検索したところ、JSONに変換して格納するサンプルがいくつか見つかりました。

次のような拡張メソッドを用意すると良いようです。

// セッションにオブジェクトを設定・取得する拡張メソッドを用意する
public static class SessionExtensions {
    // セッションにオブジェクトを書き込む
    public static void SetObject<TObject>(this ISession session, string key, TObject obj) {
        var json = JsonConvert.SerializeObject(obj);
        session.SetString(key, json);
    }

    // セッションからオブジェクトを読み込む
    public static TObject GetObject<TObject>(this ISession session, string key) {
        var json = session.GetString(key);
        return string.IsNullOrEmpty(json)
            ? default(TObject)
            : JsonConvert.DeserializeObject<TObject>(json);
    }
}

// 拡張メソッドを使ってみる
// セッションにSampleクラスを書き込む
HttpContext.Session.SetObject("key", new Sample());

// セッションからSampleクラスを読み込む
HttpContext.Session.GetObject<Sample>("key");

とりあえず基本的な使い方はこんな感じかなと。

まだ調べていなくて気になる部分がいくつかあります。CoreではState Serverはないの?とか、ロックされるの?とか、HttpSessionState.Abandonは?とか。

どうなんでしょう。追々調べていきたいと思います。