我们使用的是 Windows Server AppFabric 1.1(而不是 Azure),我认为我们已经设法污染了缓存,因此我们得到了一些奇怪的结果。
我们使用的是通读提供程序,因此如果密钥不在缓存中,则通读提供程序会转到数据库,填充缓存并将值返回给客户端。(顺便说一句,微软的团队决定要求通读提供程序应该存在于 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 时缓存始终抛出空引用异常。
从例外:
Microsoft.ApplicationServer.Caching.Core
在 Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte[][] buffers, Boolean writable) 在 Microsoft.ApplicationServer.Caching.Utility 的 Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte[][] buffers)。在 Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() 处反序列化(Byte[][] 缓冲区,布尔 checkTypeToLoad)\r\n
我怀疑我们的通读提供程序在错误情况下做错了,但我还没有证明这一点。但是,我不希望 AppFabric 像这样从它的核心抛出空引用异常。
这是一个已知问题吗?有没有人有任何进一步的信息可能会有所帮助?