|
|
Paskelbta 2015-04-19 22:06:12
|
|
|
|

ASP.NET išvesties talpykla (t. y. statinis HTML) buvo pagrįsta atmintimi iki .NET 4.0. Tai reiškia, kad jei mūsų svetainėje yra daug talpyklos, lengva sunaudoti vietinę atmintį. Dabar, padedant . OutputCacheProvider .NET 4.0 turime keletą galimybių sukurti savo talpyklą. Pavyzdžiui, HTML išvesties talpyklą galime saugoti memcached paskirstytame klasterio serveryje arba MongoDB (dažniausiai naudojama į dokumentus orientuota duomenų bazė, skaitykite šį http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Žinoma, talpyklą taip pat galime saugoti kaip failą standžiajame diske, o tai yra pigiausias būdas tai padaryti, atsižvelgiant į mastelio keitimą, o šis straipsnis yra apie tai, kaip sukurti pasirinktinę failų talpyklą.
1:Išvestinės talpyklos teikėjas "OutputCacheProvider" yra abstrakti bazinė klasė, kurią turime perrašyti keturis jos metodus, kurie yra: Pridėti metodą, kaip įterpti nurodytą elementą į išvesties talpyklą. Gauti metodas, kuris pateikia nuorodą į nurodytą elementą išvesties talpykloje. Pašalinkite nurodyto elemento pašalinimo iš išvesties talpyklos metodą. Nustatyti metodą, įterpia nurodytą elementą į išvesties talpyklą ir perrašo elementą, jei jis yra talpykloje.
2: Sukurkite savo failų talpyklos tvarkymo klasę Tipas yra FileCacheProvider, o kodas yra toks:
- public class FileCacheProvider : OutputCacheProvider
- {
- private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-
- public override void Initialize(string name, NameValueCollection attributes)
- {
- base.Initialize(name, attributes);
- CachePath = HttpContext.Current.Server.MapPath(attributes["cachePath"]);
- }
-
- public override object Add(string key, object entry, DateTime utcExpiry)
- {
- Object obj = Get(key);
- if (obj != null) //这一步很重要
- {
- return obj;
- }
- Set(key,entry,utcExpiry);
- return entry;
- }
-
- public override object Get(string key)
- {
- string path = ConvertKeyToPath(key);
- if (!File.Exists(path))
- {
- return null;
- }
- CacheItem item = null;
- using (FileStream file = File.OpenRead(path))
- {
- var formatter = new BinaryFormatter();
- item = (CacheItem)formatter.Deserialize(file);
- }
-
- if (item.ExpiryDate <= DateTime.Now.ToUniversalTime())
- {
- log.Info(item.ExpiryDate + "*" + key);
- Remove(key);
- return null;
- }
- return item.Item;
- }
-
-
- public override void Set(string key, object entry, DateTime utcExpiry)
- {
- CacheItem item = new CacheItem(entry, utcExpiry);
- string path = ConvertKeyToPath(key);
- using (FileStream file = File.OpenWrite(path))
- {
- BinaryFormatter formatter = new BinaryFormatter();
- formatter.Serialize(file, item);
- }
- }
-
- public override void Remove(string key)
- {
- string path = ConvertKeyToPath(key);
- if (File.Exists(path))
- File.Delete(path);
- }
-
- public string CachePath
- {
- get;
- set;
- }
-
- private string ConvertKeyToPath(string key)
- {
- string file = key.Replace('/', '-');
- file += ".txt";
- return Path.Combine(CachePath, file);
- }
- }
-
- [Serializable]
- public class CacheItem
- {
- public DateTime ExpiryDate;
- public object Item;
-
- public CacheItem(object entry, DateTime utcExpiry)
- {
- Item = entry;
- ExpiryDate = utcExpiry;
- }
- }
Kopijuoti kodą Yra dvi vietos, kurioms reikia skirti ypatingą dėmesį: Taikant pridėjimo metodą, yra sąlyginis sprendimas, kuris turi būti tvarkomas tokiu būdu, kitaip talpyklos mechanizmas talpykloje išsaugos pirmąjį rezultatą, o talpykla baigsis pasibaigus galiojimo laikui ir nebus atkurta. Programos pavyzdyje mes tiesiog įdėjome talpyklą į talpyklos katalogą, o faktinėje projekto praktikoje, atsižvelgiant į tai, kad talpykloje saugomų puslapių bus tūkstančiai, turime atlikti katalogų klasifikaciją, kitaip talpyklos failų radimas ir skaitymas taps efektyvumo kliūtimi, kuri išeikvoja procesorių.
3: Konfigūracijos failas
Web.config turime sukonfigūruoti, kad talpyklos apdorojimo programa yra pasirinktinis FileCacheProvider, t. y. pridėkite mazgą pagal FileCacheProvider:- <caching>
- <outputCache defaultProvider="FileCache">
- <providers>
- <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
- </providers>
- </outputCache>
- </caching>
Kopijuoti kodą
4: Talpyklos naudojimas
Mes darome prielaidą, kad naudojant jį MVC kontrolės (jei norite jį naudoti ASP.NET puslapyje, įtraukti <% į page@OutputCache VaryByParam="none" Duration="10" %>), ir jūs galite pamatyti, kad indeksas nėra išvesties talpykloje, o Index2 yra išvesties talpykloje 10 sekundžių.
- public class HomeController : Controller
- {
- private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
- static string s_conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";
- public ActionResult Index()
- {
- using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))
- {
- ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
- }
- return View();
- }
-
- [OutputCache(Duration = 10, VaryByParam = "none")]
- public ActionResult Index2()
- {
- using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))
- {
- ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
- }
- return View();
- }
- }
Kopijuoti kodą 5: Patikrinkite efektą Aukščiau pateiktas kodas, prisijungęs prie "Index2", talpyklos aplanke sugeneruos talpyklos failą taip:
Dabar įvertinkime išvesties talpyklos ir išvesties talpyklos našumo palyginimą, imituodami 100 vienu metu pateiktų užklausų iš 100 vartotojų taip:
|
Ankstesnis:Seanso gyvavimo ciklasKitą:C#. .NET, kad būtų išvengta SQL injekcijos atakų
|