HttpRuntime.Cache vs. HttpContext.Current.Cache

本文详细探讨了ASP.NET中的两种缓存机制:HttpRuntime.Cache与HttpContext.Current.Cache的区别及应用场景。通过源代码分析揭示了两者之间的内在联系与区别,并给出了实际使用的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

已经有人说过这个话题,相关链接:

HttpRuntime.Cache vs. HttpContext.Current.Cache
http://weblogs.asp.net/pjohnson/archive/2006/02/06/437559.aspx

HttpContext.Cache和HttpRuntime.Cache
http://blog.joycode.com/dotey/archive/2005/01/15/43091.aspx

我这里要说的是从另外一个角度来说:

一,两个实现代码的差异:
我们用 .NET Reflector  看 HttpContext 类的 Cache 属性 ,会看到如下代码:

 
public Cache Cache { get { return HttpRuntime.Cache; } }

所以,两者在代码上是完全一致的。


二、两者的差异其实在于 HttpContext.Current

用 .NET Reflector  看 HttpContext.Current 如下:

 
public static HttpContext Current { get { return (ContextBase.Current as HttpContext); } }

ContextBase 类的静态属性  Current 如下:

 
internal static object Current { get { return CallContext.HostContext; } }


CallContext 类的静态属性 HostContext 如下:

 
public static object HostContext { get { IllogicalCallContext context1 = Thread.CurrentThread.GetIllogicalCallContext(); object obj1 = context1.HostContext; if (obj1 == null) { LogicalCallContext context2 = CallContext.GetLogicalCallContext(); obj1 = context2.HostContext; } return obj1; } }

显然,非 Web 应用 HttpContext.Current 返回 null 是因为
ContextBase.Current as HttpContext 这么一句,返回的 null 。

ContextBase.Current 是有值的,但是由于非 Web 应用,返回的 Object 无法转换为HttpContext,而返回 null 的。

所以, HttpContext.Current.Cache 只可能用于 Web 应用的缓存。 而且是跟 HttpContext 紧密联系的。


三、HttpRuntime.Cache 可用于非 Web 应用的缓存。

比如我如下的一个控制台程序,是可以正常读写缓存的。而这里当然是不可以使用  HttpContext.Cache 的。

 
static void Main( string [] args) { System.Web.Caching.Cache c = System.Web.HttpRuntime.Cache; if (c != null) { c.Insert("1", "123141432432"); object o = c.Get("1"); Console.WriteLine(o); } Console.ReadLine(); }

总结,
1、HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了。但是非 Web 应用也是可以拿来用的。
2、HttpContext.Cache 是对上述缓存类的封装,由于封装到了 HttpContext ,局限于只能在知道 HttpContext 下使用,即只能用于 Web 应用。

综上所属,在可以的条件,尽量用  HttpRuntime.Cache ,而不是用  HttpContext.Cache 。

Gravatar
#  re: HttpRuntime.Cache vs. HttpContext.Current.Cache
www.suanshu.net/blog转载了此文
2006/9/4 13:25 | rthy
Gravatar
#  回复: HttpRuntime.Cache vs. HttpContext.Current.Cache
分析得太好了!
以下是msdn中的一段代码
using System;
using System.Web;
using System.Web.Caching;
public static class ReportManager
{
private static bool _reportRemovedFromCache = false;
static ReportManager()
{ }

public static String GetReport()
{
lock (typeof(ReportManager))
{
if (HttpContext.Current.Cache["MyReport"] != null)
return (string)HttpRuntime.Cache["MyReport"];
else
{
CacheReport();
return (string)HttpRuntime.Cache["MyReport"];
}
}
}

public static void CacheReport()
{
lock (typeof(ReportManager))
{
HttpContext.Current.Cache.Add("MyReport",
CreateReport(), null, DateTime.MaxValue,
new TimeSpan(0, 1, 0),
System.Web.Caching.CacheItemPriority.Default,
ReportRemovedCallback);
}
}

private static string CreateReport()
{
System.Text.StringBuilder myReport =
new System.Text.StringBuilder();
myReport.Append("Sales Report<br />");
myReport.Append("2005 Q2 Figures<br />");
myReport.Append("Sales NE Region - $2 million<br />");
myReport.Append("Sales NW Region - $4.5 million<br />");
myReport.Append("Report Generated: " + DateTime.Now.ToString()
+ "<br />");
myReport.Append("Report Removed From Cache: " +
_reportRemovedFromCache.ToString());
return myReport.ToString();
}

public static void (String key, object value,
CacheItemRemovedReason removedReason)
{
_reportRemovedFromCache = true;
CacheReport();
}
}

每次从ReportRemovedCallback方法中调用CasheReport方法,运行到HttpContext.Current.Cache.Add都会发现Current为NULL,导致异常。看楼主一分析,明白了!
谢谢!
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值