这是我见过的最奇怪的错误之一。
我正在做一个非常简单的调用来从 HttpRuntime 缓存返回值。电话是:
return HttpContext.Current.Cache[cacheKey];
如果它返回null,那很好。我检查返回值是否为 null 并采取相应措施。我已经使用这个电话很长时间了。
最近,由于某种原因,当 cacheKey 设置为这个确切值时:
"Topic_GridSelectAll:5,null,2010-08-31-20-00-00,Published,desc,5,1"
抛出 System.OverflowException:取反二进制补码的最小值无效。
呼叫、相关代码或服务器没有任何变化。如果 cacheKey 有稍微不同的字符,它工作得很好。例如,这个 cacheKey 返回 null 而不抛出任何异常:
"Topic_GridSelectAll:5,null,2010-08-31-21-00-00,Published,desc,5,1"
请注意,这两个字符串之间的唯一区别是时间字符:2010-08-31-20-00-00 与 2010-08-31-21-00-00。
为什么这会有什么不同?为什么现在这么久了?
堆栈跟踪是:
[OverflowException: Negating the minimum value of a twos complement number is invalid.]
System.Math.AbsHelper(Int32 value) +12753486
System.Web.Caching.CacheMultiple.UpdateCache(CacheKey cacheKey, CacheEntry newEntry, Boolean replace, CacheItemRemovedReason removedReason, Object& valueOld) +142
System.Web.Caching.CacheInternal.DoGet(Boolean isPublic, String key, CacheGetOptions getOptions) +122
MyProject.Helpers.CacheHelper.GetData(String cacheDomain, String cacheKey) in ...
我尝试将缓存调用更改为使用 HttpRuntime.Cache 代替(即。HttpRuntime.Cache[cacheKey]
),但这没有任何区别。我知道它是相同的底层缓存提供程序,但我认为不同的调用可能会有所不同。没有骰子。