HttpContext.Current.Cache 和 HttpRuntime.Cache 对象区别
HttpContext.Current.Cache 和 HttpRuntime.Cache 对象区别
      .NET中Cache有两种调用方式:HttpContext.Current.Cache 和 HttpRuntime.Cache,这两种方式有什么区别呢?我们先看MSDN上的解释:
      HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象。
      HttpRuntime.Cache:获取当前应用程序的Cache。
      我们再用.NET Reflector工具看看HttpContext.Cache和HttpRuntime.Cache的实现:

 //System.Web.HttpContext.Cache属性实现
    //System.Web.HttpContext.Cache属性实现 public sealed class HttpContext
    public sealed class HttpContext {
    { public Cache Cache
        public Cache Cache {
        { get
            get {
            { return HttpRuntime.Cache;
                return HttpRuntime.Cache; }
            } }
        } }
    }

 //System.Web.HttpRuntime.Cache属性实现
    //System.Web.HttpRuntime.Cache属性实现 public sealed class HttpRuntime
    public sealed class HttpRuntime {
    { public static Cache Cache
        public static Cache Cache {
        { get
            get {
            { if (AspInstallDirectoryInternal == null)
                if (AspInstallDirectoryInternal == null) {
                { throw new HttpException(SR.GetString("Aspnet_not_installed", new object[] { VersionInfo.SystemWebVersion }));
                    throw new HttpException(SR.GetString("Aspnet_not_installed", new object[] { VersionInfo.SystemWebVersion })); }
                } Cache cache = _theRuntime._cachePublic;
                Cache cache = _theRuntime._cachePublic; if (cache == null)
                if (cache == null) {
                { CacheInternal cacheInternal = CacheInternal;
                    CacheInternal cacheInternal = CacheInternal; CacheSection cacheSection = RuntimeConfig.GetAppConfig().Cache;
                    CacheSection cacheSection = RuntimeConfig.GetAppConfig().Cache; cacheInternal.ReadCacheInternalConfig(cacheSection);
                    cacheInternal.ReadCacheInternalConfig(cacheSection); _theRuntime._cachePublic = cacheInternal.CachePublic;
                    _theRuntime._cachePublic = cacheInternal.CachePublic; cache = _theRuntime._cachePublic;
                    cache = _theRuntime._cachePublic; }
                } return cache;
                return cache; }
            } }
        } }
    } 
通过上面的代码我们可以看出:HttpContext.Current.Cache是调用HttpRuntime.Cache实现的,两者指向同一Cache对象。那么两者到底有没有区别的?既然两个指向的是同一Cache对象,两者的差别只能出现在HttpContext和HttpRuntime上了。我们再来看看MSDN中HttpContext和HttpRuntime的定义。
HttpContext:封装有关个别HTTP请求的所有HTTP特定的信息,HttpContext.Current为当前的HTTP请求获取HttpContext对象。
HttpRuntime:为当前应用程序提供一组ASP.NET运行时服务。
由上面的定义可以看出:HttpRuntime.Cache相当于就是一个缓存具体实现类,这个类虽然被放在了System.Web命名空间下,但是非Web应用下(winform)也是可以使用;HttpContext.Current.Cache是对上述缓存类的封装,由于封装到了HttpContext类中,局限于只能在知道HttpContext下使用,即只能用于Web应用。
下面的例子可以很好的说明这一点:

 class CacheTest
    class CacheTest {
    { static void Main(string[] args)
        static void Main(string[] args) {
        {        System.Web.Caching.Cache httpRuntimeCache = System.Web.HttpRuntime.Cache;
            System.Web.Caching.Cache httpRuntimeCache = System.Web.HttpRuntime.Cache; httpRuntimeCache.Insert("httpRuntimeCache", "I am stored in HttpRuntime.Cache");
            httpRuntimeCache.Insert("httpRuntimeCache", "I am stored in HttpRuntime.Cache");
 if (httpRuntimeCache != null)
            if (httpRuntimeCache != null) {
            { Console.WriteLine("httpRuntimeCache:" + httpRuntimeCache["httpRuntimeCache"]);
                Console.WriteLine("httpRuntimeCache:" + httpRuntimeCache["httpRuntimeCache"]); }
            }
 System.Web.HttpContext httpContext = System.Web.HttpContext.Current;
            System.Web.HttpContext httpContext = System.Web.HttpContext.Current; if (httpContext == null)
            if (httpContext == null) {
            { Console.WriteLine("HttpContext object is null in Console Project");
                Console.WriteLine("HttpContext object is null in Console Project"); }
            } else
            else {
            { System.Web.Caching.Cache httpContextCache = httpContext.Cache;
                System.Web.Caching.Cache httpContextCache = httpContext.Cache; httpContextCache.Insert("httpContextCache", "I am stored in HttpRuntime.Cache");
                httpContextCache.Insert("httpContextCache", "I am stored in HttpRuntime.Cache"); if (httpContextCache == null)
                if (httpContextCache == null) {
                { Console.WriteLine("httpContextCache is null");
                    Console.WriteLine("httpContextCache is null"); }
                } }
            } 
              Console.ReadLine();
            Console.ReadLine(); }
        } }
    } 
      输出结果:httpRuntimeCache:I am stored in HttpRuntime.Cache
      HttpContext object is null in Console Project
      综上:我们在使用Cache时,尽量使用HttpRuntime.Cache,既能减少出错,也减少了一次函数调用。
    虽功未成,亦未敢藏私,众侠诸神通尽录于此,竟成一笈,名葵花宝典,以飨后世。
邮箱:steven9801@163.com
QQ: 48039387
邮箱:steven9801@163.com
QQ: 48039387
 
                    
                     
                    
                 
                    
                

 
         
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号