請允許我先閑扯兩句。
今天發生了不少事情。首先,確認了我已經為20年後的技術社區做出了不可磨滅的貢獻。其次,[.NETRegex庫](http://regex-lib.net)終於去掉了令人惱火的驗證碼,轉而使用IP地址檢驗。最近兩篇blog我將介紹其中用到的一些技巧。
今天要說的是在緩衝時使用SqlCacheDependency。其應用情境是IP地址屏蔽,資料庫裡有一張表IPBlocked,記錄了被屏蔽的IP。由於每次進行註冊或嘗試登入時都要檢查IP,而IP屏蔽表又不會經常變化,所以需要使用緩衝。並且該緩衝依賴該資料表,即如果表中資料發生了變化,緩衝應該失效。
好睏啊,不多扯了,我這裡就給出操作步驟。
1. 修改web.config,啟用SqlCacheDependency。將下列代碼加入web.config的<system.web>節:
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add connectionStringName="regex_libConnectionString" name="IPBlockedDependency"/>
</databases>
</sqlCacheDependency>
</caching>
這裡的connectionStringName指定了在<connectionStrings>中添加的某一個連接字串。name則是為該SqlCacheDependency起的名字,這個名字將在第3步中用到。
2. 執行下述命令,為資料庫啟用緩衝依賴:
C:\Program Files\Microsoft Visual Studio 9.0\VC>aspnet_regsql -C "Data Source=.;Initial Catalog=regex-lib;Integrated Security=True" -ed -et -t "IPBlocked"
這裡-C後面的字串是連接字串(請替換成自己所需要的值),-t參數後面的字串是資料表的名字。命令執行後,資料庫中會多出一個AspNet_SqlCacheTablesForChangeNotification表。
3. 在代碼中使用緩衝,並為其設定SqlCacheDependency依賴:
private static string[] GetBlockedIPs()
{
// 1嘗試從緩衝中讀取
string[] ips = (string[])HttpContext.Current.Cache[BlockedIPCacheKey];
if (ips != null)
return ips;
// 2從資料庫中讀取
using (RxDataContext db = new RxDataContext())
{
ips = db.IPBlockeds.Select(ipb => ipb.UserIP).ToArray();
}
// 3放入緩衝
SqlCacheDependency depend = new SqlCacheDependency("IPBlockedDependency", "IPBlocked");
HttpContext.Current.Cache.Insert(BlockedIPCacheKey, ips, depend);
return ips;
}
建立SqlCacheDependency時需要指定web.config中定義的SqlCacheDependency名字,並指定資料表的名稱。
好了,這隻是一個步驟列表,或者可以當作一個checklist用。
------
最後,[.NETRegex庫](http://regex-lib.net)在註冊、登入和發表回複時已經沒有什麼過多的限制了,歡迎大家訪問、註冊、把您的Regex分享進來。