我正在尝试缓存数据并继续失败。正如您在下面的代码中看到的,我调用Web服务返回一个名为“categories”的数组。这个电话成功了,我收到了回复信息。在使用结果填充下拉列表后,我使用Insert将信息存储到缓存中。在页面刷新时(我想我应该说除了回发之外的任何内容),我检查缓存以查看信息是否存在。它永远不会。抓住我的头......
if (! IsPostBack)
{
//See if the results have been cached. With arrays and checking for null, you have to
//check the array itself before its elements can be checked.
string[] saveCatList = Cache.Get("Categories" + Session["sessionID"]) as string[];
if (saveCatList == null || string.IsNullOrEmpty(saveCatList[0]))
{
WBDEMOReference.getcatlist_itemcategories[] categories;
strResult = callWebServ.getcatlist(Session["sessionID"].ToString(),
out strResultText, out dNumOfCat, out categories);
for (int i = 0; i < categories.Length; i++)
{
//ddCat is the ID number of the category drop down list
ddCat.Items.Add(new ListItem(categories[i].categorydesc.ToString(),
categories[i].categorynumber.ToString()));
}
//Store the array into cache. 'Cache.Remove' will remove the cache for that key
Cache.Insert("Categories" + Session["sessionID"], categories, null,
DateTime.Now.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration);
}
}
答案 0 :(得分:3)
我认为sJhonny在评论中得到了它。您将categories
(WBDEMOReference.getcatlist_itemcategories
数组)放入缓存中,但在将其取回时执行as string[]
。类型与as关键字不匹配将导致null值。尝试将as string[]
更改为as WBDEMOReference.getcatlist_itemcategories[]
或添加一项检查,看看它是否存在,而不使用as string[]
演员。
答案 1 :(得分:1)
看起来你使用的是在webcontext中没有使用的HttpContext Cache可以为null,因此建议将是HttpRuntime Cache。运行时缓存将始终在您的应用程序中可用,例如甚至在控制台应用程序中
即使是HttpContext也会使用HttpRuntime Cache,但在您的场景中看起来运行时缓存可能会起作用
我很乐意删除我的答案,如果有人纠正我的建议是错误的