Может ли AppFabric быть поставщиком состояния сеанса и использовать локальный кеш? - PullRequest
6 голосов
/ 08 сентября 2010

Я использую AppFabric в качестве поставщика состояния сеанса в своем приложении ASP.Net MVC2, и я хотел бы, чтобы оно также использовало локальный кэш. У меня есть следующая запись в моем web.config сразу после узла configSections:

<dataCacheClient>
    <localCache
         isEnabled="true"
         sync="TimeoutBased"
         objectCount="100000"
         ttlValue="300" />
    <hosts>
        <host name="127.0.0.1" cachePort="22233"/>
    </hosts>
</dataCacheClient>

У меня также есть следующая запись в web.config как дочерний элемент узла system.web:

<sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider">
    <providers>
        <add name="AppFabricCacheSessionStoreProvider" type="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider" cacheName="Default" sharedId="DefaultId"/>
    </providers>
</sessionState>

К сожалению, если я добавлю что-то в сессию, а затем выполню следующие две команды в PowerShell AppFabric, все, что я добавил к своим данным сеанса, больше не будет, и я не верю, что оно не использует локальный кеш:

Stop-CacheCluster
Start-CacheCluster

Я также пытаюсь кэшировать объекты с помощью AppFabric, используя следующий код, и после того, как я запускаю и останавливаю CacheCluster, один раз кэшированный объект больше не кэшируется:

var factory = new DataCacheFactory();
var cache = factory.GetCache("Default");
cache.Put("Key", "Test");

Однако, если я создаю экземпляр AppFabric с использованием следующего кода, где я явно говорю ему использовать локальный кеш, а не полагаться на запись web.config, это работает:

var servers = new List<DataCacheServerEndpoint>(1) { new DataCacheServerEndpoint("127.0.0.1", 22233) };
var configuration = new DataCacheFactoryConfiguration {
                Servers = servers,
                LocalCacheProperties = new DataCacheLocalCacheProperties(100000, new TimeSpan(0, 30, 0), DataCacheLocalCacheInvalidationPolicy.TimeoutBased)
            };
var factory = new DataCacheFactory(configuration);
var cache factory.GetCache("StpWebSession");
cache.Put("Key", "Test");

Что я делаю не так, почему моя запись web.config не работает, говоря AppFabric об использовании локального кэша? Можете ли вы использовать AppFabric в качестве поставщика состояния сеанса, а также использовать локальный кеш?

1 Ответ

4 голосов
/ 09 сентября 2010

Я нашел маленькую чепуху в http://social.msdn.microsoft.com/Forums/en-US/velocity/thread/24e72dab-bb20-47ec-aae2-77423b1d296b.

По сути, «enableSessionState» по умолчанию имеет значение «true», что означает, что вам нужно удаленно выполнять все запросы. Если для свойства установлено значение «ReadOnly», объект состояния сеанса будет извлекаться из локального кэша. Затем, если локальный кеш недействителен, он снова отправится в удаленное хранилище.

...