3

我正在尝试缓存数据并一直失败。正如您在下面的代码中看到的,我调用 Web 服务返回一个名为“类别”的数组。这个电话是成功的,我得到了信息。在使用结果填充下拉列表后,我使用 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);
    }
}
4

2 回答 2

3

我认为 sJhonny 在评论中得到了它。您将categories(数组WBDEMOReference.getcatlist_itemcategories)放入缓存中,但as string[]在将其取出时执行。与 as 关键字不匹配的类型将导致 null 值。尝试更改as string[]as WBDEMOReference.getcatlist_itemcategories[]添加检查以查看它是否存在而不使用强制转换as string[]

于 2012-07-09T20:17:10.473 回答
1

看起来您正在使用未在 webcontext 中使用的 HttpContext Cache 可以为 null,因此建议是 HttpRuntime Cache。运行时缓存将始终在您的应用程序中可用,例如即使在控制台应用程序中

甚至 HttpContext 在后台使用 HttpRuntime Cache 但在您的场景中看起来运行时缓存可能会完成这项工作

如果有人纠正我给出的建议是错误的,我很乐意删除我的答案

于 2012-07-09T19:55:00.497 回答