ASP.NET CoreにおけるSessionの扱い方

公開日:2018-12-07
最終更新:2018-12-07

依存関係を登録

StartUp.csに依存関係を登録する。
注意点は、ConfigureではUseMvcより前にUseSessionを記述しないと例外が発生する。

public void ConfigureServices(IServiceCollection services)  
{  
    service.AddSession(options =>  
    {  
        options.IdleTimeout = TimeSpan.FromSeconds(20);  
        options.Cookie.HttpOnly = true;  
    });  
}  

public void Counfigure(IApplicationBuilder app, IHostingEnvironment env)  
{  
    app.UseSession();  
    // 必ずUseMvcより前にSessionを読み込む  
    app.UseMvc();  
}  

Controllerでの使い方

// APIの追加  
using Microsoft.AspNetCore.Http;  

public class SampleController : Controller  
{  
    public IActionResult Index()  
    {  
        // Sessionに文字列を格納  
        HttpContext.Session.SetString("key", "value");  

        return View();  
    }  

    public IActionResult About()  
    {  
        // Sessionから値を取り出す  
        var val = Http.Session.GetString("key");  

        return View();  
    }  

}  

SessionにObjectを格納できるようにする

デフォルトではSessionに格納できるのは文字列しかない。
クラスなどのオブジェクトを格納できるようにSessionクラスを拡張する。
SessionExtentionsクラスを任意のディレクトリに作成する。
実装はここを参考。(丸コピ…)

using Microsoft.AspNetCore.Http;  
using Newtonsoft.Json;  

public static class SessionExtentions  
{  
    public static void SetObject<TObject>(this ISession session, string key, TObject value)  
    {  
        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>(object);  
    }  
}  

SetObjectではNewonsoft.Jsonライブラリで受け取ったオブジェクトをJsonに変換してstringとしてSessionに格納している。
GetObjectでは逆の工程をしているが、最終行は三項演算子でjsonの中がNull/空の場合の処理も加えている。
このクラスファイルを含むディレクトリをusingすればSessionにオブジェクトを格納できる。

Sessionをカスタムコンポーネントで使う

ASP.NETではHttpContext.Currentを使ってどこからでもHttpContextアクセスできた。
だがASP.NET CoreではCurrentが廃止され、.NET Coreの提供する部分以外からHttpContextにアクセスすることができない。(例えば独自でビジネスロジックをコントローラーから分離している場合など)
IHttpContextAccessorの依存性を注入する必要がある。
手順はリファレンス通り。

StartUp.csに依存関係を登録。

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddHttpContextAccessor();  
}  

カスタムコンポーネント内のコンストラクタではHttpContextAccessorの依存性を宣言

public class SampleService: ISampleService  
{  
    private readonly IHttpContextAccessor _httpContextAccessor;  

    public SampleService(IHttpContextAccessor httpContextAccessor)  
    {  
        _httpContextAccessor = httpContextAccessor;  
    }  

    public void BusinessSampleA()  
    {  
        // Sessionに文字列を格納  
        _httpContextAccessor.HttpContext.Session.SetString("key", "value");  
    }  

    public string BusinessSampleB()  
    {  
        // Sessionから値を取得  
        var str = _httpContextAccessor.HttpContext.Session.GetString("key");  

        return str;  
    }  
}  

ここによれば、ASP.NETにあってASP.NET Coreでなくなったものはそこそこあるらしい。

記事が少しでもいいなと思ったらクラップを送ってみよう!
0
+1
@showyleeの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする