こんばんは、statemachineです。しばらくぶりのBlogですが、今回はWindows Azure AppFabric Cachingについて。特に問題なく使えているのですが、ASP.NETのセッションプロバイダーとして構成したときに、ちょいとはまったので備忘録を兼ねて。
Compute Emulator + Full IIS
サンプルの動作確認をするときに、Compute Emulatorで実行するわけですが、このときインスタンスを複数展開すると例外が発生したりします。例外を参照すると、どうも異なるインスタンス間でセッションデータを共用できないみたいです。
先駆者である割と普通氏のCTP期間中の検証結果は、こちらにあり、Compute Emulator + Full IISで動作しないことは一致します。CTP中はInProcのような動作であったようですが、こんどは例外で落ちています。
ErrorCode
ローカルのロードバランサを介すると検証が面倒なので、IIS Managerを開きます。こうすると各インスタンスがどのポート番号でリッスンしているか一目瞭然。
このときは、http://127.0.0.1:5101/ が一番最初に割り当てられたようで、そのインスタンスは正しく表示できますが、残りは全部エラーとなります。
Configuration Settings for the ASP.NET 4 Caching Session State Provider をみるとどうも、applicationName属性が必要そうです。XMLスニペットにはapplicationName属性の定義はありません。定義がない場合、デフォルトとして、キャシュキーの生成をHttpRuntime.AppDomainAppIdを元にしているそうです。これがCompute Emulator上で展開された各インスタンスで異なり、セッションデータが共用できないみたいでした。
以下のように、applicationName属性を足してあげます。
<sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider"> <providers> <add name="AppFabricCacheSessionStoreProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" useBlobMode="true" dataCacheClientName="default" applicationName ="AppFabricSampleApp"/> </providers> </sessionState>
各インスタンスから正しく表示できるようになりました。
Server Caching
Server Caching は、sharedId属性があるようですが、Azure Cachingには無いように見えます。