程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> USE HttpRuntime.Cache OVER HttpContext.Current.Cache

USE HttpRuntime.Cache OVER HttpContext.Current.Cache

編輯:.NET實例教程

緩存是在ASP.Net開發中經常需要用到在技術,在使用過程中,通常會用到HttpRuntime.Cache和HttpContext.Current.Cache。而且在使用過程中,通常會覺得這兩個似乎用哪一個都行,都能達到緩存數據的目的。那麼這兩個Cache到底有什麼不同呢?在什麼時候用哪一個比較好呢?這裡談談我的一些了解和看法吧。

  兩者的異同

  先來看看msdn的解釋

 

  HttpContext.Cache : Gets the ASP.Net Cache object for the current request

  HttpContext.Current : Gets the HttpContext object for the current request

 

  從這個解釋看,得到的Cache對象是當前請求的Cache對象。個人認為,這個解釋有點誤導性,會讓人誤以為這時的Cache對象只是對於當前的Request的。而稍微想一下之後,就會發現這種理解是錯誤的。如果Cache的內容只對當前的Request有用,那有何須緩存呢?

  既然msdn得解釋不行,那就直接看源代碼吧,^_^,用Reflector打開HttpContext.Cache, 可以看到

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

  從這代碼可以看出,兩者返回的都是是一樣的。

  難道這兩者真的就完全一樣嗎?再來看看HttpContext.Current

public static HttpContext Current 

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

  ContextBase的源代碼:

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.Cache來訪問Cache存在著幾乎可以忽略不計的類型轉換過程。而對於非Web項目來說,將ContextBase.Current轉換為HttpContext就會返回null。除此之外,調用HttpContext還需要一些而外的查找工作,需要解析當前正在運行的的線程和當前的context。不過,個人認為這點小小的額外的工作應該不會帶來什麼性能問題。

  HttpRuntime.Cache可以用在非Web項目中

  這聽起來有點怪怪的,呵呵,HttpRuntime的Cache居然可以用在非Web項目中。但是事實正是如此,需要做的只不過是把System.Web這個dll加到我們項目中來就好了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved