2016年3月12日 星期六

ASP.NET MVVM - 主從式網站資料的Cache服務

主從式網站資料的Cache服務
Excalibur中一直有個能夠利用Cache物件儲存網頁ViewState於後端伺服器中的功能
過去啟用需以Web.config設定Path的方式,但現在的新版本我們有了更快速方便使用的方法
只要直接在Page上加一行程式碼
[PageCacheViewState(true, false)]
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}
當PageCacheViewState使用後網頁前端原始碼
產生到前端的網頁只有一段GUID資料,此功能Cache Timeout預設留存40分鐘(可web.config設定)
讓ASPX網頁的ViewState資料不要往返前後端在PostBack時消耗頻寬傳送,可大幅提升網頁效能速度
並且在新版本Excalibur使用Cache的方式也有項很特別的變更,就是其中附加了一隻新的Cache服務程式
只要當第一次Cache時類別庫會自動的在伺服器啟動一個Excalibur.Scabbard背景行程
此行程的功用就是專門用來儲存Cache的,它會以TCP/IP的方式和持續和網站連線,將序列化後的資料儲存於其中
為何我們需要特地為Cache這麼做呢?因為IIS的機制本身會定期回收網站行程,而且IIS網站可以設定多行程並行
原本ASP.NET提供的Cache卻只能依附在單一網站行程內,只要工作區關閉重啟Cache資料必定會消失
若是設定多行程的網站,行程之間使用的Cache也不會是同一份資料
更有可能因為線上網站是有使用負載平衡,多台主機的資料根本沒辦法跨主機行程共用
預設的情況我們不需任何設定就會為一個網站開啟一個Excalibur.Scabbard行程
若需要跨網站或主機間使用,只要於Web.config中指定IP和Port即可
<configuration>
  <configSections>
    <section name="extensions" type="CachePage.ExtensionsConfigSection"/>
  </configSections>
  <extensions>
    <cacheService>
      <netServer hostName="127.0.0.1" port="6143"></netServer>
      <!--<netClient hostName="127.0.0.1" port="6143"></netClient>-->
    </cacheService>
  </extensions>
</configuration>
很簡單的在主網站的Server用netServer設定,其他網站Client用netClient設定
然後這個Cache服務不僅僅只能用來暫存ViewState,Excalibur也提供了可以呼叫的方法

只要將原始的Cache物件使用方式改成有Item的擴充函式就可以了
ps. Excalibur.Scabbard行程關閉條件是在IIS關閉網站後,沒有任何網站與它連線的5分鐘左右自動關閉