3

我在我的 asp.net 应用程序中缓存了一堆简单的查找表,因为源数据位于与我们的主要 Web 架构不同的服务器上,并且很少更改。我一直在这里关注答案和各种文档,并且我的初始加载函数调用如下:

HttpContext.Current.Cache.Insert("CheckLocations", GetAllCheckLocations(), _
                                 Nothing, DateAdd(DateInterval.Day, 1, Now()), _
                                 System.Web.Caching.Cache.NoSlidingExpiration, _
                                 CacheItemPriority.Normal, _
                                 New CacheItemRemovedCallback(AddressOf CheckLocationsExpired))

对于我的缓存过期回调,我有以下代码。

Public Shared Sub CheckLocationsExpired(ByVal key As String, ByVal value As Object, ByVal reason As CacheItemRemovedReason)

   Dim dtCheckLocation As New ReferenceSchema.CheckLocationDataTable
   dtCheckLocation = GetAllCheckLocations()

   HttpContext.Current.Cache.Insert("CheckLocations", dtCheckLocation, Nothing, _
                                    DateAdd(DateInterval.Day, 1, Now()), _
                                    System.Web.Caching.Cache.NoSlidingExpiration, _
                                    CacheItemPriority.Normal, _
                                    New CacheItemRemovedCallback(AddressOf CheckLocationsExpired))

End Sub

作为记录,GetAllCheckLocations 方法只是调用 Web 服务并将结果解析到正在存储的数据表中。

现在,当我重新编译应用程序以进行本地测试时,一切仍然正常,但我在日志文件中发现以下异常消息:

System.NullReferenceException:对象引用未设置为对象的实例。在 C:\Projects\HR\EAF 2.0\DAL\CacheMethods.vb 中的 EAF.CacheMethods.CheckLocationsExpired(字符串键,对象值,CacheItemRemovedReason 原因):System.Web.Caching.CacheEntry.CallCacheItemRemovedCallback(CacheItemRemovedCallback 回调,CacheItemRemovedReason)的第 434 行原因)

我验证数据确实存在并且是最新的,当我单步调试调试器时,命令参数中的任何内容似乎都不合适。

有人知道我在这里想念什么吗?这是像 Reponse.Redirect 问题这样的“细微差别”中的另一个,在技术上终止处理会引发线程中止异常?

4

4 回答 4

4

您可能想改用HttpRuntime.Cache。如果您从单元测试等中调用 HttpContext.Current ,则它可能为 null 。

于 2009-02-17T22:35:33.813 回答
2

当你不给它一个回调函数时它仍然异常吗?似乎委托函数在空对象方面存在问题。

于 2009-02-17T21:59:08.787 回答
0

我最初的想法是 GetAllCheckLocations 正在抛出异常或返回 null。

于 2009-02-17T21:55:12.930 回答
0

也许你用AJAXPro什么来调用方法。

于 2009-05-13T07:21:15.183 回答