asp.net coreではセッション等は基本的にはサーバー上で管理しない。
asp.netのセッション変数をasp.net coreでほぼ同様に使用するには、Microsoft.AspNetCore.Sessionを使用する。
Microsoft.AspNetCore.Sessionでは、Cookieを使用して、セッション情報を保持する。
セッションをaps.net coreで使用するためには、StartupとConfigureに以下のコードを追加する必要がある。
public void ConfigureServices(IServiceCollection services)
{
// 分散キャッシュの指定(アプリのインスタンス内で有効)
services.AddDistributedMemoryCache();
// セッションサービスの追加
services.AddSession(opt=>{
// オプション指定
opt.IdleTimeout = TimeSpan.FromMinutes(20);
opt.Cookie.IsEssential = true;
});
・・・
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
・・・
app.UseRouting();
app.UseAuthorization();
// セッションを使用
app.UseSession();
・・・
}
セッション変数に値をセットしたり、取得するには、暗黙で宣言されている、HttpContext変数を使用する。
// セッション変数へ値をセット(文字列)
HttpContext.Session.SetString("MyString","Hello");
// セッション変数へ値をセット(整数)
HttpContext.Session.SetInt32("MyInt",123);
// セッション変数から値を取得(文字列)
string mystring = HttpContext.Session.GetString("MyString");
// セッション変数から値を取得(整数)
int myint = HttpContext.Session.GetInt32("MyInt");
// クラスインスタンス等を保存するには、Json等でシリアライズする必要がある
class MyClass {
public string MyString { get; set; }
public int MyInt { get; set; }
}
・・・
MyClass c = new MyClass() { MyString="Hello", MyInt = 123 };
// JSON文字列へ変換
string sessvalue = JsonSerializer.Serialize(c);
// セッション変数へ文字列として保存
HttpContext.Session.SetString("MyClassInsance", sessvalue);
・・・
// 文字列からインスタンスへデシリアライズ
MyClass cc = JsonSerializer.Deserialize<MyClass>(HttpContext.Session.GetString("MyClassInstance"));
以下のような拡張メソッドを作っても良い。
public static class SessionExtention {
public static T Get<T>(this ISession session, string key) {
string val = session.GetString(key);
return val == null ? default : JsonSerializer.Deserialize<T>(val);
}
public static void Set<T>(this ISession session, string key, T val) {
string jsonstr = JsonSerializer.Serialize(val);
session.SetString(key,jsonstr);
}
}
と、こんな感じでセッション変数を扱うことが可能。