(Azureではなく)Windows Server AppFabric 1.1を使用しており、キャッシュを汚染して、奇妙な結果が得られたと思います。
リードスループロバイダーを使用しているため、キーがキャッシュにない場合、リードスループロバイダーはデータベースに移動し、キャッシュにデータを入力して、値をクライアントに返します。(余談ですが、Microsoftのチームは、リードスループロバイダーがGACに存在することを要求することを決定しました。これは終わりのない苦痛を引き起こしたので、リードスルーの使用をお勧めしません。彼らがこの選択を再検討することを願っています。)
私の問題の症状は、キャッシュからアイテムを取得しようとすると、リードスループロバイダーがデータベースから値をフェッチすることを期待しているときにnullを返すことです。繰り返される呼び出しはnullを返し、データベースの一時的な問題を除外します。アイテムをキャッシュから削除して再度取得しようとすると、成功します。
問題の範囲を理解するために、キャッシュ内のすべてのアイテムを次のように列挙すると思いました。
foreach (string regionName in cache.GetSystemRegions())
{
var objectsInRegion = cache.GetObjectsInRegion(regionName);
try
{
foreach (var keyValuePair in objectsInRegion)
{
var result = string.Format(
"Key: {0}. Value: {1}", keyValuePair.Key, keyValuePair.Value);
Console.WriteLine(result);
}
}
catch (NullReferenceException)
{
Console.WriteLine("Unable to get key value pair");
}
}
特定のリージョンのobjectsInRegionを列挙するときに、キャッシュが常にnull参照例外をスローしていたため、例外処理があります。
例外から:
Microsoft.ApplicationServer.Caching.Core
Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte [] [] buffers、Boolean writable)at Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte [] [] buffers)atMicrosoft.ApplicationServer.Caching.Utility。 Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext()\ r \ nでDeserialize(Byte [] [] buffers、Boolean checkTypeToLoad)
リードスループロバイダーがエラー状態で何か問題を起こしているのではないかと思いますが、まだ証明していません。ただし、AppFabricがこのようなコアからnull参照例外をスローすることは期待していません。
これは既知の問題ですか?誰かが役立つかもしれないさらなる情報がありますか?