ASP.NET Cache始终返回null

时间:2013-08-30 09:51:22

标签: asp.net sqlcachedependency

我在使用SQLCacheDependency的{​​{1}}应用中使用ASP.NET。 我跟着this article成功设置了我的数据库。但是每当我试图将数据存储在Query Notifications对象中时,它只是没有值。它总是cache。我是没有任何错误或例外。 这是我的代码

Global.asax中

null

代码背后

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"); }

任何人都可以帮助我指出可能缺少的东西吗?

1 个答案:

答案 0 :(得分:3)

您可以做很多事情来调试代码并得出结论。您的缓存项似乎过于频繁删除。

1。)使用CacheItemPriority.NotRemovable到Cache.Insert()以确保ASP.NET不会删除     只要感觉如此,你的物品。使用解释hereInsert()方法。检查一下MSDN     文章也是。

2.。)要找出删除缓存项目的原因,请使用以下内容记录此删除操作     CacheItemRemovedCallback方法的Cache.Insert()委托选项。请查看此Insert method overload版本以及此link

3.确保您的dtresultreader不为空。检查行:

SqlDataReader reader = cmd.ExecuteReader();& dtResult.Load(reader);,以及您的日志。

4.。)检查您的应用程序池循环时间。此link包含与应用程序池设置(IIS 7 +)相关的​​所有内容。

5.这个链接有一个IIS 6 App池的解决方案: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);