3

私はSQLCacheDependency自分のASP.NETアプリケーションでQuery Notifications. この記事に従って、データベースを正常にセットアップしました。ただし、オブジェクトにデータを保存しようとすると、cache常に値が保持されませんnull。エラーや例外は発生しません。これが私のコードです

Global.asax

void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        System.Data.SqlClient.SqlDependency.
        Start(ConfigurationManager.ConnectionStrings["McdConn"].ToString());

    }

void Application_End(object sender, EventArgs e)
    {
        //  Code that runs on application shutdown
        System.Data.SqlClient.SqlDependency.
        Stop(ConfigurationManager.ConnectionStrings["McdConn"].ToString());
    }

public static class CacheManagement
{
    public static DataTable CreateCache(string cacheName, string tableName, string query)
    {
        DataTable dtResult = new DataTable();
        try
        {
            string connectionString = ConfigurationManager.ConnectionStrings["McdConn"].ToString();
            dtResult = HttpContext.Current.Cache[cacheName] as DataTable;

            if (dtResult == null)
            {
                dtResult = new DataTable();
                using (var cn = new SqlConnection(connectionString))
                {
                    cn.Open();
                    var cmd = new SqlCommand(query, cn);
                    cmd.Notification = null;
                    cmd.NotificationAutoEnlist = true;
                    SqlCacheDependencyAdmin.EnableNotifications(connectionString);
                    if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(connectionString).Contains(tableName))
                    {
                        SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString,tableName);
                    }

                    var dependency = new SqlCacheDependency(cmd);
                    //SqlDataAdapter ad = new SqlDataAdapter(cmd);
                    //ad.Fill(dsResult);
                    SqlDataReader reader = cmd.ExecuteReader();
                    dtResult.Load(reader);
                    HttpContext.Current.Cache.Insert(cacheName, dtResult, dependency);

                }
            }
        }
        catch (Exception ex)
        {
            Exception_Log.ExceptionMethod("Web", "CacheManagement.cs", "CacheManagement", ex);
        }

        return dtResult = HttpContext.Current.Cache[cacheName] as DataTable;
    }

}

コードビハインド

var dtCachedCategories = HttpContext.Current.Cache["tbl_CategoryMaster_Cached"] as DataTable;
if (dtCachedCategories == null)
{
 dtCachedCategories = CacheManagement.CreateCache("tbl_CategoryMaster_Cached","dbo.tbl_CategoryMaster_Languages", "Select * from dbo.tbl_CategoryMaster_Languages");

}

上記は常に を返しますnull

何が欠けている可能性があるかを指摘するのを手伝ってくれる人はいますか?

4

1 に答える 1

4

コードをデバッグして結論を​​出すためにできることはたくさんあります。キャッシュされたアイテムが頻繁に削除されているようです。

1.) CacheItemPriority.NotRemovableCache.Insert() を使用して、ASP.NET がアイテムを削除するように感じたときにアイテムを削除しないようにします。ここでInsert()説明する方法を使用してください。このMSDN の記事もチェックしてください。

2.) キャッシュされたアイテムが削除される理由を調べるに CacheItemRemovedCallback は、メソッドのデリゲート オプションを使用してこの削除アクションをログに記録しますCache.Insert()このInsert メソッドのオーバーロードバージョンと、このリンクを確認してください。

3.) dtresultyour と yourreaderが null でないことを確認してください。次の行を確認します。

SqlDataReader reader = cmd.ExecuteReader(); & dtResult.Load(reader);、ログと一緒に。

4.) アプリケーション プールのリサイクル時間を確認します。このリンクには、アプリケーション プールの設定 (IIS 7 以降) に関連するすべてが含まれています。

5.) このリンクには、IIS 6 のアプリケーション プールのソリューションがあります: http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon

また、HttpRuntime.Cacheメソッドを使用して、動作するかどうかを確認してください。

System.Web.HttpRuntime.Cache.Insert(cacheName, dtResult, dependency);
于 2013-08-30T16:16:29.323 に答える