Pergunta

Embora eu tenha especificado uma chave única, parece o seguinte código irá retornar um valor para 5 pedidos, em seguida, outro para o próximo par, em seguida, voltar para o valor salvo no pedido original e apenas continuar até que haja 10 dos objetos diferentes todos armazenados sob a mesma chave. Em seguida, ele parece quase aleatória quais desses valores ele irá retornar a partir do cache.

string strDateTime = string.Empty;
string cachename = "datetimeexample";
object cachedobject = HttpRuntime.Cache.Get(cachename);
if (cachedobject != null)
    strDateTime = (string)cachedobject;
else
{
    strDateTime = DateTime.Now.ToString();
    HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null);
}
Response.Write(strDateTime +"        keys:"+ HttpRuntime.Cache.Count);

Muito confuso, é isso por causa de enfiar ou algo assim?

Foi útil?

Solução

Ignorando a possibilidade de um farm de servidores e balanceamento de carga, este comportamento pode ser causado pelo pool de aplicativos executado como um web-jardim . Para citar a seção relevante do MSDN:

Porque jardins Web permitem o uso de vários processos, cada processo vai tem sua própria cópia do aplicativo estado, em processo de estado de sessão, caches e dados estáticos. Ambientes web não deve ser utilizado para todos aplicações, especialmente se eles precisam para manter o estado. Tenha certeza de aferir o desempenho do aplicação antes de decidir se modo de ambiente Web é apropriado.

Isso fará com que ele apareça como se o cache é armazenar vários valores para a mesma chave, tendo efetivamente entradas duplicadas no cache.

Para resolver esse no IIS 7, abra o pool de aplicativos Configurações avançadas e set processos de trabalho máxima para 1. Para IIS 6, veja o MSDN artigo (Com screenshots bonitas).

Apesar de 8 meses de atraso, eu estou respondendo a esta pergunta, porque eu achei muito antes de eu encontrei este artigo decente sobre web-jardim gotchas . Esperemos que esta resposta vai economizar futuros pesquisadores um pedaço de tempo. :)

Outras dicas

Seu CacheKey é sempre 'datetimeexample', portanto, você sempre terá um objeto no cache; e você sempre receberá o objeto de volta.

Eu não sou completamente certo o que você está tentando realizar aqui, tanto quanto eu estou preocupado, este se comporta exatamente da maneira que é suposto fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top