2 つのサーバーに Web サイト コードがあり、それらの間で共有キャッシュが必要なため、Microsoft AppFabric を使用しています。キャッシュには 1 つのアイテムだけが必要です。サイトの訪問者ごとに 1 つのアイテムではなく、合計で 1 つのアイテムだけです。
これを達成するために使用しているコードを以下に示しますが、思い通りに動作していません。問題は、すべて同じキーを持っているにもかかわらず、キャッシュに多くのアイテムがあることだと思います。しかし、それは別のことが起こっている可能性があります。詳細については、コードのコメントを参照してください。
でWeb.config
:
<dataCacheClient>
<hosts>
<host name="MyHost1" cachePort="22233"/>
<host name="MyHost2" cachePort="22233"/>
</hosts>
<securityProperties mode="None" protectionLevel="None" />
</dataCacheClient>
...
<system.web>
<sessionState mode="InProc" customProvider="AppFabricCacheSessionStoreProvider">
<providers>
<add
name="AppFabricCacheSessionStoreProvider"
type="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider"
cacheName="MyCache"
sharedId="MySharedApp"/>
</providers>
</sessionState>
...
</system.web>
でGlobal.asax.cs
:
private static DataCacheFactory _cacheFactory = new DataCacheFactory();
private static DataCache _cache;
private void RegisterCacheEntry(){
try
{
// Set up cache
_cache = _cacheFactory.GetCache("MyCache");
// Prevent duplicate key addition
if (_cache.GetCacheItem(CacheItemKey) != null || _cache.Get(CacheItemKey) != null)
return;
// Add item to cache
_cache.Add(CacheItemKey, CacheItem, TimeSpan.FromMinutes(10));
// When the cache item is removed, the callback:
// 1) sends me an email
// 2) adds the same item with the same key to the cache again.
// So I SHOULD be getting one email every 10 minutes.
// However, it starts with one, but the number of emails that I get increases every 10 minutes.
// i.e., I get one email at time t=0, two emails at t=1, three at t=2, then four, etc.
_cache.AddItemLevelCallback(CacheItemKey, DataCacheOperations.RemoveItem, CacheItemRemovedCallback);
}
catch (Exception e){}
}
私が行っていることとその理由について詳しく知りたい場合は、ここで説明されているように、キャッシュ タイムアウトを使用して Windows サービスをシミュレートしようとしています。しかし、これを2つのサーバーで動作させようとしています。