asp.net coreでのセッション変数

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);
    }
}

と、こんな感じでセッション変数を扱うことが可能。

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。
カテゴリー: asp.net core, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください