3

データのキャッシュを試していますが、失敗し続けています。以下のコードでわかるように、「categories」という配列を返すようにWebサービスを呼び出します。この呼び出しは成功し、情報が返されます。ドロップダウンリストに結果を入力した直後に、挿入を使用して情報をキャッシュに保存します。ページが更新されると(ポストバック以外のことを言うべきだと思います)、キャッシュをチェックして情報がそこにあるかどうかを確認します。決してそうではありません。これに頭をかいて...

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で使用されていないHttpContextCacheを使用しているように見えますが、nullになる可能性があるため、HttpRuntimeCacheを提案します。ランタイムキャッシュは、たとえばコンソールアプリでも、アプリケーションで常に利用できます。

HttpContextでさえ内部でHttpRuntimeキャッシュを使用しますが、シナリオではランタイムキャッシュがその役割を果たしているように見えます

誰かが私に与えられたアドバイスが間違っていると私を訂正した場合、私は私の答えを削除させていただきます

于 2012-07-09T19:55:00.497 に答える