比較的大きめ(10万行くらい?)のWebアプリを作るのに、アプリケーションを分けて構成したくなったりする。そういう時に問題になるのが、アプリ間でのセッション共有。いちをSQLServerで出来るんだけど、やっぱDBをストアにすると多少遅くなる。

.net core でのセッションの実装はなんだかんだでココが一番わかりやすい。

.net core では 昔の「Session」みたいなのはいきなりは使えないのね。キャッシュを使う模様。

で、.net core でもサイト間でセッション共有するやり方は提供されてて、SQLServerとRedisが使えるみたい。今回はRedisを使ったんだけど、すごくはまった。

Redisを使ったセッションの共有はここに書いてある。

まず、Redisのインストール。上記に書いてある通りでいけるんだけど、プロキシ使ってる環境だと上手くいかない。その場合はココが一番参考になる。

Redisがインストール出来たら、コマンドプロンプトで「redis-server」って打って実行しておく。

そしたらNugetで「Microsoft.AspNetCore.Session」と「Microsoft.AspNetCore.DataProtection.Redis」をプロジェクトにインストールする。

そしたら.net core mvc の StartUpのコンフィグを下の感じにする。

using Microsoft.AspNetCore.DataProtection;
using StackExchange.Redis;

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    //キャッシュにRedisを使う場合
    services.AddDistributedRedisCache(options =>
    {
        options.Configuration = "localhost";
        options.InstanceName = "SampleInstance";
    });
    
    //プロテクションの設定をする(セッション共有する場合はここが必須。
    var redis = ConnectionMultiplexer.Connect("localhost:6379");
    services.AddDataProtection()
        .SetApplicationName("HogeApp")//これが必要!!!!!
        .PersistKeysToRedis(redis, "DataProtection-Keys");
    
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromSeconds(600);
        options.Cookie.HttpOnly = true;
        options.Cookie.Name = "NetCoreWebAppSessionKey";//これは適当に(なくてもいい)
    });
}

SetApplicationNameでそれぞれのサイトで名称一緒にしないと共有できなかった。

あー、これは同一ホスト上で複数のWebアプリを動かして、アプリ間でセッション共有したい場合の話。ホストが別の場合はまた色々考えないといけない模様。つかホスト跨いでセッション共有とかすることあるのかな?

ロードバランサで分けると思うんだとも、その場合ってIPかセッションクッキーでのバランシングするよね?そうするとユーザは1サーバにしか基本いかないからホスト跨ぐことないような気がするけど、どうなんでしょね。リクエスト毎にサーバを回されることってあるんかな?まぁアプリの作り次第か。。。

あと、Redisにどんなクエリが来てるのか見たい場合は、コマンドプロンプトで「redis-cli」を実行して、「moniter」って入れるとredisに来たリクエストが見れる。