App_Code中的类如何访问Cache?

本文解答了一位学生关于如何在ASP.NET项目的App_Code文件夹中的类访问Cache的问题。通过将HttpContext对象传递给App_Code中的类,使其能够在不同的页面中正确地操作缓存。

App_Code中的类如何访问Cache?

一位学生来邮件问以下问题:

金老师:
    您好,我在学习中遇到一个奇怪的问题。自己这么也想不明白。身边也没有人可以请教。
只好麻烦您了,希望得到解答。

在.aspx.cs中存在一个Cache对象,我在.aspx.cs中使用Cache.Insert("key",object)方法装
载一个解析后的xml对象放入Cache中,这样做一切正常。
可是后来我想在单独在App_Code文件夹里单独建一个.cs文件做同样的事情,却发现在这里不
能直接调用Cache对象对象了,
于是我using System.Web.Caching后自己定义了一个Cache对象,然后用这个对象来Insert;

mychche = new Cache();
if (mychche["xmlen"] == null)//在这里报NullReferenceException
{}
真的这么也搞不明白这里为什么会NullReferenceException,mychche明明已经初始化了,myc
hche["xmlen"]我在前面也已经Insert(key,object)了,
希望得到您的帮助
谢谢了

============================

回答:

你这样用,在App_code中:
public class MyUseCache
{
 public MyUseCache()
 {
  //
  //TODO: 在此处添加构造函数逻辑
  //
 }

    public void InsertCache(HttpContext context)
    {
        context.Cache.Insert("cacheKey", "hello2");
    }
}

在ASP.NET网页中:

public partial class UseCache : System.Web.UI.Page
{
    private MyUseCache obj = new MyUseCache();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            obj.InsertCache(Context);
            Response.Write("Data is Added to Cache");
        }
        else
            Response.Write(Cache["cacheKey"]);
    }
}
你问题的关键在于:
App_Code中的类是全局类型,所有页面都可以创建它的实例,而每个页面都生存于特定HTTP请求上下文中。
因此,通过将特定的上下文对象传送给它,就能访问到Cached对象。

 

如果hook定义如下,static struct nf_hook_ops app_dpi_hook_ops = { .hook = app_dpi_hook, #if (LINUX_VERSION_CODE < KERNEL_VERSION(4,4,6)) .owner = THIS_MODULE, #endif .pf = PF_INET, .hooknum = NF_INET_FORWARD, .priority = NF_IP_PRI_FIRST, }; static struct nf_hook_ops app_dpi_hook_ops_v6 = { .hook = app_dpi_hook, #if (LINUX_VERSION_CODE < KERNEL_VERSION(4,4,6)) .owner = THIS_MODULE, #endif .pf = PF_INET6, .hooknum = NF_INET_FORWARD, .priority = NF_IP_PRI_FIRST, };且原始代码static void __exit fini(void) { mutex_lock(&module_exit_mutex); // 设置退出标志 atomic_set(&module_exiting, 1); smp_wmb(); // 等待所有正在执行的钩子完成 synchronize_rcu(); msleep(100); // 额外等待时间确保所有钩子完全退出 #if CONFIG_APP_DPI_ENABLE int i; #endif // 先停止定时器,避免定时器回调中使用钩子 #if CONFIG_APP_DPI_ENABLE if (timer_pending(&app_dpi_timer)) { del_timer_sync(&app_dpi_timer); } #endif // 注销conntrack通知器 #if CONFIG_APP_DPI_ENABLE #ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS nf_conntrack_unregister_notifier(&init_net, &app_dpi_ct_notifier); synchronize_rcu(); // 等待通知器完全注销 #endif #endif // 注销socket选项 nf_unregister_sockopt(&app_dpi_socket_option); synchronize_rcu(); // 注销netfilter钩子 - 使用更安全的方式 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) #if CONFIG_APP_DPI_ENABLE // 检查钩子是否已初始化再注销 if (app_dpi_hook_ops.hook) { nf_unregister_net_hook(&init_net, &app_dpi_hook_ops); synchronize_rcu(); app_dpi_hook_ops.hook = NULL; // 清空防止重复注销 } if (app_dpi_hook_ops_v6.hook) { nf_unregister_net_hook(&init_net, &app_dpi_hook_ops_v6); synchronize_rcu(); app_dpi_hook_ops_v6.hook = NULL; } #endif //CONFIG_APP_DPI_ENABLE #if (CONFIG_APP_QOS_SUPPORT || WORK_FOR_SKIP_ONLY) if (app_qos_hook_ops.hook) { nf_unregister_net_hook(&init_net, &app_qos_hook_ops); synchronize_rcu(); app_qos_hook_ops.hook = NULL; } if (app_qos_hook_ops_v6.hook) { nf_unregister_net_hook(&init_net, &app_qos_hook_ops_v6); synchronize_rcu(); app_qos_hook_ops_v6.hook = NULL; } #endif //CONFIG_APP_QOS_SUPPORT || WORK_FOR_SKIP_ONLY #else //LINUX_VERSION_CODE < KERNEL_VERSION(4,13,0) #if CONFIG_APP_DPI_ENABLE if (app_dpi_hook_ops.hook) { nf_unregister_hook(&app_dpi_hook_ops); synchronize_rcu(); app_dpi_hook_ops.hook = NULL; } if (app_dpi_hook_ops_v6.hook) { nf_unregister_hook(&app_dpi_hook_ops_v6); synchronize_rcu(); app_dpi_hook_ops_v6.hook = NULL; } #endif //CONFIG_APP_DPI_ENABLE #if (CONFIG_APP_QOS_SUPPORT || WORK_FOR_SKIP_ONLY) if (app_qos_hook_ops.hook) { nf_unregister_hook(&app_qos_hook_ops); synchronize_rcu(); app_qos_hook_ops.hook = NULL; } if (app_qos_hook_ops_v6.hook) { nf_unregister_hook(&app_qos_hook_ops_v6); synchronize_rcu(); app_qos_hook_ops_v6.hook = NULL; } #endif //CONFIG_APP_QOS_SUPPORT || WORK_FOR_SKIP_ONLY #endif //LINUX_VERSION_CODE // 最终同步,确保所有钩子完全卸载 synchronize_rcu(); msleep(200); // 给系统更多时间完成清理 // 清理proc文件系统 #ifdef CONFIG_APP_QOS_SUPPORT if(app_qos_dir != NULL){ proc_remove(app_qos_dir); app_qos_dir = NULL; } #endif // 清理profile数据 #if CONFIG_APP_DPI_ENABLE for (i = 0; i < PROFILE_SIZ; ++i) { spin_lock_bh(&profile_lock); profile_node_free(l_profiles + i); spin_unlock_bh(&profile_lock); } #endif //CONFIG_APP_DPI_ENABLE // 清理hash表 #if ENABLE_AD_GUARD if (ad_hash) { cache_hashlist_clear(ad_hash); } #endif #ifdef CONFIG_APP_QOS_SUPPORT spin_lock_bh(&qos_lock); if (l_app_qos.hash) { cache_hashlist_clear(l_app_qos.hash); } spin_unlock_bh(&qos_lock); #endif dbg("app-dpi: Remove module successed!\n"); mutex_unlock(&module_exit_mutex); return; } 请结合panic位置和反汇编信息,给出最小修改方式
最新发布
09-02
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值