ASP.NETのセッション管理にAzure Redis Cacheを使ってみる

# 0. 前書き
前回「[ASP.NETのセッション管理方法を整理する](http://qiita.com/84zume/items/dce5c9b496665183f1a9)」で、ASP.NETのセッション管理方法についてまとめました。今回は、Custom定義のバリエーションとして、Azure Redis Cacheを用いたセッション管理方法について手順をまとめます。

**バージョン情報**

|name|ver.|
|:--|:---:|
|ASP.NET MVC|4.5.2|
|Microsoft.Web.RedisSessionProvider|2.0.1|

# 1. Azure Redis Cacheとは
Redis Cacheとは、オープンソースのNoSQLです。ちょっと古い記事ですが、こちらの説明が分かりやすかったです⇒「[redis、それは危険なほどのスピード](http://ameblo.jp/principia-ca/entry-11197286812.html)」。そのRedis Cacheを基盤にしてAzureのサービスとしたものが、Azure Redis Cacheというわけです。

# 2. 実際に使ってみる
Azure Redis Cacheを有効化し、アプリケーションで利用するまでを手順を追って説明していきます。


## 2-1. Azure Redis Cacheを新規に作成する
Azureのポータルにて、Azure Redis Cacheサービスの利用開始をします。
「データ＋ストレージ」のところに、Redis Cacheがありました。

![AzurePortal.jpg](https://qiita-image-store.s3.amazonaws.com/0/34410/f9a0cde8-2663-1ea6-64d8-d28730d742ea.jpeg)

※DNS名と、リソースグループは潰しています。適宜入力してください。

「作成」を押すとデプロイが始まり、数分待つと「実行中」になります。「実行中」になりましたら、設定画面から

* host：ホスト名
* port：ポート番号（デフォルトSSLが有効になっているため、6380）
* accessKey：アクセスキー

を取得してください。のちの設定で利用します。

## 2-2. ASP.NET MVCのアプリケーションを作成する
Visual Studioにて、新規のASP.NET MVCアプリケーションを作成します。

## 2-3. RedisSessionProvierをインストールする
Azure Redis Cache用のセッションプロバイダーを先ほど作成したアプリケーションにインストールします。
nugetを利用して、dllのダウンロード・参照追加、Web.configにサンプルコードの追加をしてもらいます。
プロジェクトを右クリックして、「NuGetのパッケージ管理」を選ぶとGUIでパッケージのインストールができます。
「Microsoft.Web.RedisSessionProvider」で絞り込み。

![nuget.jpg](https://qiita-image-store.s3.amazonaws.com/0/34410/f8a7103c-db9f-e818-3ed2-3a612bb09f54.jpeg)


## 2-4. Web.configに定義を追加する
2-1で取得した定義をWeb.configに反映します。

```xml:web.config
<system.web>
  ...
  <sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
      <add name="MySessionStateStore"
            type="Microsoft.Web.Redis.RedisSessionStateProvider"
            host="XXXXXXX.redis.cache.windows.net"
            port="6380"
            accessKey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
            ssl="true" />
    </providers>
  </sessionState>
</system.web>
```

## 2-5. 動作確認用のコードを書く
動作確認用のコードは、Indexページにアクセスした時刻をSessionに記録し、
AboutページでSessionから復元する、といった動きにします。「time」をキーにSessionにデータを格納します。

```csharp:HomeController.cs
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Session["time"] = DateTime.Now;
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Oldtime = Session["time"];
        ViewBag.Now = DateTime.Now;
        return View();
    }
}
```

結果を、Aboutページで表示します。

```html:About.cshtml
@{
    ViewBag.Title = "About";
}
<h2>@ViewBag.Title.</h2>

<p>
    Indexページを開いた日時 @ViewBag.Oldtime
</p>
<p>
    このページを開いた日時 @ViewBag.Now
</p>
```

# 3. 実行結果
時間が保存されてAboutページで復元されました！

![result.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/843487f6-b126-0fb5-0889-83f18b54fe45.jpeg)

本当にAzure Redis Cacheが利用されているかは、Redis Desktop Managerを使い、Redisに直接アクセスして確認します。
（[Redis Desktop Managerを使ってみる](http://qiita.com/akiko-pusu/items/64561b4d97f4435b8645)←このあたりを参考）

![result2.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/eeb939bc-9a66-b3fb-8f45-2fcb80bf405c.jpeg)

timeというkeyで値が保管されていることを確認できました！
ちなみに上のRDMの結果は、2つのブラウザからアクセスしましたあとにスクリーンショットをとりました。
そのためセッション情報が2つ格納されていることが分かります。

# 4. おわりに
可用性の高いセッションサーバが簡単にできて便利ですね。
これがあるなら、SQL Serverをセッション管理に使う理由ってなんなんだろう。

# 5. 参考
「ASP.NET MVC5　実践プログラミング」　山田祥寛さん著

書籍のサンプルがAzure Redis Cacheのプレ版だったこともあり、本記事では最新版を対象にして書いてみました。