ASP.NET Core MVC - Sessionを使う
いつものごとく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は?とか。
どうなんでしょう。追々調べていきたいと思います。