1.1 S dng page-caching và fragment-caching
V
V
Bn cn tăng hiu năng bng cách lưu gi các trang được tr v.
#
#
Thêm ch th OutputCache vào trang hoc điu kim người dùng, và ch định
trang s được gi trong cache bao lâu (tính theo giây).
Vic s dng caching va phi có th gim bt hiu ng tht c chai (chng hn, truy
xut cơ s d liu) và tăng toàn b hiu năng ca mt website. Caching có hiu qu ln
trong mt site có lưu lượng cao. Ví d, xét xem điu gì s xy ra khi bn lưu gi mt
trang hin th kết qu ca mt truy vn cơ s d liu. Nếu bn lưu gi trang này trong 1
phút, và trang này nhn được 10 yêu cu trong khong thi gian đó, bn s gim được 10
ln chi phí truy xut cơ s d liu.
Bn có th hin thc caching mt cách d dàng—ch cn thêm ch th OutputCache vào
trang web. Ch th này phi được thêm vào file .aspx, ch không phi file .cs. Ví d dưới
đây lưu gi mt trang trong 20 giây:
<%@ OutputCache Duration="20" VaryByParam="None" %>
Và ví d dưới đây lưu gi mt trang trong 20 giây nhưng vn duy trì các bn sao tùy vào
giá tr ca các đối s chui truy vn:
<%@ OutputCache Duration="20" VaryByParam="*" %>
Bn có th th nghim caching bng mt trang hin th ngày và gi trên server. Bn s
nhn thy rng các yêu cu đến sau (đối vi trang này) không khiến cho thi gian được
to mi. Theo đó, thi gian cũ s đưc hin th cho đến khi trang hết hiu lc.
Output-caching không hiu qu trong các trường hp sau đây:
Trang ca bn cn t tùy biến y theo các thiết lp đặc thù ca người dùng như thông
tin xác thc (đối tượng User) hoc trng thái (đối tượng Session). Trong trường hp
này, nó không to cm giác s dng li cùng mt trang cho tt c các người dùng.
Trang ca bn cha các điu kim post-back và dng nên các s kin phía server.
Trang ca bn cn thc hin mt hành động khác (như ghi ra file nht ký, nhp
thông tin vào cơ s d liu, hoc thay đổi mt biến ng dng). Mt trang được lưu
gi s s dng li toàn b HTML đã được tr v; phn mã cho trang b b qua.
Trang ca bn có cha các d liu cn phi được to cùng vi các d liu hin hành.
Đây là trường hp đối vi tìm kiếm sn phm, nhưng không phi là trường hp đối
vi danh mc sn phm.
Trong các trường hp này, bn có th s dng mt dng caching linh hot hơn. Bn có
th s dng data-caching (s được mô t trong mc 7.15) để lưu gi mt đối tượng c
th. Hoc bn có th s dng fragment-caching để lưu gi mt phn ca trang. Để s
dng fragment-caching, bn cn to mt điu kim người dùng cha tt c ni dung có
th được lưu gi và thêm ch th OutputCache vào điu kim người dùng. Khi đó, bn có
th s dng điu kim người dùng này trong mt trang web. Phn mã cho trang web vn
s chy, nhưng phn điu kim người dùng có th được lưu gi.
1.2 Dùng li d liu vi ASP.NET Cache
V
V
Bn cn s dng caching, nhưng bn không th lưu gi toàn b mt trang vì nó
cha mt s mã cn phi chy hoc mt s ni dung cn phi được to động.
#
#
S dng phương thc Cache.Insert để lưu gi bt k đối tượng nào vi chính
sách hết hiu lc trượt (sliding expiration) hoc hết hiu lc tuyt đối (absolute
expiration).
Đối tượng Cache cho phép bn lưu gi hu như bt k đối tượng .NET nào bng mt
khóa chui cùng vi chính sách hết hiu lc do bn định nghĩa. ASP.NET duy trì cache
mt cách t động, g b các đối tượng khi chúng hết hiu lc hoc khi cn b nh.
Có hai kiu chính sách hết hiu lc bn có th s dng khi lưu gi d liu trong cache.
Hết hiu lc tuyt đối (absolute expiration) làm mt hiu lc các item đã được lưu gi
sau mt khong thi gian c định, gn ging vi output-caching. Hết hiu lc tuyt đối là
cách tiếp cn tt nht nếu bn mun lưu gi các thông tin cn được làm tươi định k (như
danh mc sn phm).
// Lưu gi ObjectToCache trong 10 phút (vi khóa là "Catalog").
// TimeSpan.Zero cho biết "không s dng sliding expiration".
Cache.Insert("Catalog", ObjectToCache, null,
DateTime.Now.AddMinutes(10), TimeSpan.Zero);
Hết hiu lc trượt (sliding expiration) g b các đối tượng sau mt khong thi gian
không dùng đến. Trong trường hp này, mi khi đối tượng được truy xut, thi gian sng
ca nó s được reset. Hết hiu lc trượt làm vic tt khi bn có các thông tin luôn có hiu
lc nhưng luôn không được s dng (như d liu thuc v quá kh). Thông tin này
không cn được làm tươi, nhưng không nên gi nó trong cache nếu nó không được s
dng.
// Lưu gi ObjectToCache nếu nó được s dng ít nht
// mt ln mi 10 phút (vi khóa là "Catalog").
// DateTime.MaxValue cho biết "không s dng absolute expiration".
Cache.Insert("Catalog", ObjectToCache, null,
DateTime.MaxValue, TimeSpan.FromMinutes(10));
Bn có th ly các item t cache bng tên khóa. Tuy nhiên, bn phi luôn kim tra trước
xem item có tn ti hay không và ri ép nó thành kiu như mong mun.
Khi thêm các đối tượng vào cache, cách tt nht là to mt hàm độc lp có th tái to đối
tượng khi cn. Ví d, nếu đang lưu gi mt DataSet, bn cn to mt hàm kim tra cache
và ch truy vn li cơ s d liu khi không tìm thy DataSet. Điu này cho phép bn tránh
đi phn x lý tn nhiu thi gian nht—truy vn cơ s d liu—trong khi vn cho phép
mã lnh ca bn thay đổi hin th (chng hn, người dùng yêu cu sp th t) hoc thc
hin các hành động khác.
Ví d dưới đây s hin th mt bng cha thông tin v khách hàng được ly t mt
DataSet. Phn then cht là lp CustomerDatabase, đóng gói các chc năng cn thiết để
đổ d liu vào DataSet và qun lý cache. Vì lp này không tha kế t Page nên nó cn s
dng thuc tính tĩnh HttpContext.Current để ly tham chiếu đến đối tượng Cache.
using System;
using System.Data;
using System.Web;
using System.Configuration;
using System.Diagnostics;
using System.Web.Caching;
using System.Data.SqlClient;
public class CustomerDatabase {
private string connectionString;
// Ly tham chiếu đến đối tượng Cache.
private Cache cache = HttpContext.Current.Cache;
public CustomerDatabase() {
// Ly chui kết ni t file Web.config.
connectionString =
ConfigurationSettings.AppSettings["NorthwindCon"];
}
public DataSet GetCustomers() {
DataSet customersDS;
// Kim tra item có nm trong cache hay không.
if (cache["Customers"] == null) {
// Ly DataSet t cơ s d liu.
customersDS = GetCustomersFromDatabase();
// Lưu gi item trong cache
// cùng vi sliding expiration là 60 giây.
cache.Insert("Customers", customersDS, null,
DateTime.MaxValue, TimeSpan.FromSeconds(60));
// Hin th thông đip trong ca s Debug.
Debug.WriteLine("DataSet created from data source.");
}else {
// Hin th thông đip trong ca s Debug.
Debug.WriteLine("DataSet retrieved from cache.");
// Ly item.
customersDS = (DataSet)cache["Customers"];
}
// Tr v DataSet.
return customersDS;
}
private DataSet GetCustomersFromDatabase() {
// To DataSet.
DataSet customersDS = new DataSet();
// Đổ d liu vào DataSet.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
try {
con.Open();
adapter.Fill(customersDS, "Customers");
}catch {
customersDS = null;
}
finally {
con.Close();
}
Bước kế tiếp là to mt trang web s dng lp CustomerDatabase. Trang web dưới đây
gm mt DataGrid và mt Button. Mi khi người dùng nhp vào Button, trang s gi
phương thc CustomerDatabase.GetCustomers. Thông tin được ly t cache nếu vn còn
hiu lc hoc được truy vn li nếu 60 giây đã trôi qua. Bn có th nhn biết DataSet có
được ly t cache hay không bng cách nhìn vào kết xut trong ca s Debug.
using System;
using System.Web;
using System.Web.UI.WebControls;
public class LoginPage : System.Web.UI.Page {
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected System.Web.UI.WebControls.Button cmdGetData;
// (B qua phn mã designer.)
private void cmdGetData_Click(object sender, System.EventArgs e){
CustomerDatabase custDB = new CustomerDatabase();
DataGrid1.DataSource = custDB.GetCustomers();
DataGrid1.DataBind();
}
}
1.3 Kích hot vic g ri ng dng Web
V
V
Khi thc hin g ri mt ng dng Web vi Visual Studio .NET, bn nhn được
li “Unable to start debugging on the Web server”.
#
#
Bo đảm Internet Information Services (IIS) được cài đặt đúng, IIS được cài đặt
trước Microsoft .NET Framework, và Integrated Windows authentication được
kích hot cho thư mc cha ng dng Web.
Li “Unable to start debugging on the Web server” cho biết rng Visual Studio .NET
th biên dch ng dng Web nhưng không th thc thi nó chế độ g ri (debug mode).
Vn đề này phát sinh vì nhiu lý do: