Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Windows Azure AppFabric Cachingではまる

こんばんは、statemachineです。しばらくぶりのBlogですが、今回はWindows Azure AppFabric Cachingについて。特に問題なく使えているのですが、ASP.NETのセッションプロバイダーとして構成したときに、ちょいとはまったので備忘録を兼ねて。

Compute Emulator + Full IIS

サンプルの動作確認をするときに、Compute Emulatorで実行するわけですが、このときインスタンスを複数展開すると例外が発生したりします。例外を参照すると、どうも異なるインスタンス間でセッションデータを共用できないみたいです。

先駆者である割と普通氏のCTP期間中の検証結果は、こちらにあり、Compute Emulator + Full IISで動作しないことは一致します。CTP中はInProcのような動作であったようですが、こんどは例外で落ちています。

ErrorCode:SubStatus:Key referred to does not exist. Create objects based on a Key to fix the error.



ローカルのロードバランサを介すると検証が面倒なので、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には無いように見えます。