Cấp bậc tác giả:

TRAINING

Quản lý trạng thái với ASP.NET

Được viết bởi webmaster ngày 17/01/2014 lúc 10:53 PM
Mỗi ứng dụng web cần chia sẻ thông tin giữa các request
  • 0
  • 19648

Quản lý trạng thái với ASP.NET

Nội dung
1. Giới thiệu về Quản lý trạng thái
2. Các đối tượng quản lý trạng thái của ASP .NET
2.1 Client-based State
2.2 Server-based State
3. Cơ chế Cache của ASP .NET

1. Giới thiệu về Quản lý trạng thái
- Mỗi ứng dụng web cần chia sẻ thông tin giữa các request
- Giao thức HTTP là Stateless
+ Mỗi request gửi đến server được xem là một request mới
+ Thông tin của request trước sẽ không tồn tại cho request sau
-> ASP .NET cung cấp các cơ chế cho phép quản lý thông tin giữa các request
+ Các đối tượng quản lý trạng thái (State) phía Client và Server
+ Cơ chế Cache

2. Các đối tượng quản lý trạng thái của ASP .NET
2.1 Client-based State
- Là các đối tượng trạng thái được lưu trữ ở máy Client
- Bao gồm
+ ViewState
+ Hidden Fields
+ QueryStrings
+ Cookies

ViewState

- Duy trì thông tin trạng thái của các control trên một trang web giữa các lần postback xảy ra
- Được mã hóa và nhúng trong trang web dưới dạng ẩn

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNjI3NjE4OTU5ZGTI7l3xKXYAdsL8nY4w0bddpzSkRQ" />

- Không thích hợp cho các control chứa nhiều dữ liệu như GridView, Repeater...

Enable & Disable ViewState

- Mặc định ViewState được kích hoạt (enable) cho tất cả các Server controls
- Disable ViewState
+ Page Level
<%@ Page EnableViewState="false" … %>
+ Control Level
<asp:GridView EnableViewState="false" ... %>

- Một số Control cơ bản như TextBox, DropDownList... luôn duy trì ViewState cho dù ViewState đã bị Disable

Lập trình Quản lý ViewState

- Mục đích: lưu thông tin bổ sung giữa các lần post-back trên cùng một trang web
- ViewState có thể lưu trữ dữ liệu thuộc kiểu cơ sở hoặc kiểu tham chiếu ( đối tượng - object)
- Lưu ViewState ( name - value )
ViewState["RequestCount"] = count;
- Truy xuất ViewState (phải ép về kiểu tương ứng)
int count = (int)ViewState[nRequestCount"];

Serialization & Deserialization

- Thông tin trong ViewState được serialize vào thời điểm runtime để lưu trữ và sau đó deserialize để khôi phục thành đối tượng ban đầu
+ Serialization: Qui trình chuyển đổi một object sang một dãy bytes để lưu trữ
+ Deserialization: Qui trình khôi phục dãy bytes thành đối tượng ban đầu
+ Để một đối tượng có thể serialize và lưu trữ được trong ViewState, ta phải bổ sung thuộc tính Serializable vào đầu khai báo lớp
[Serializable] 
public class Book { ... }
Ví dụ
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack==false)
{
Book book = new Book(1, "Harry Potter”); 
ViewState[MmyBookM] = book;
}
}
protected void Button1_Click(object sender, EventArgs e) {
Book book = (Book)ViewState["myBook"]; 
Labell.Text = book.ID + " " + book.BookName;
} 

HiddenField

- Lưu trữ trạng thái trong WebForm giữa các postback
- Render về phía trình duyệt với thẻ
<input type='hidden' .. />
- Có thể sử dụng hidden field để lưu trữ trạng thái của các control trong WebForm ngay cả khi ViewState bị disable
- Chỉ thích hợp trong việc lưu trữ dữ liệu thuộc về kiểu cơ sở ( int, float, string, ... ) 

QueryString

- Là thông tin bổ sung thêm vào cuối chuỗi URL
http://domain/pathfile?name1=value1&name2=value2
- Query string được Url encoded ( các ký tự đặc biệt hoặc dấu xuất hiện trong query string đều được thay thế )
http://www.whatever.com/file.aspx?p=resum%E9&name=John+Lock
- Thông tin truyền đi bị giới hạn (IE - 2Kb)
- Không thích hợp truyền các thông tin bảo mật
- Nhận thông tin truyền từ Query string
string name = Request.QueryString["name"].ToString();

Cookies

- Là các thông tin (name - value) được lưu trong một hoặc nhiều tập tin trên máy tính client
- Các tập tin cookies do Browser quản lý
- Kích thước của tập tin cookies có giới hạn (khoảng 4Kb)
- Browser sẽ tự động xóa file cookie vào thời điểm được chỉ định trong thuộc tính Expires của cookie
- Ứng dụng lưu các thông tin về Client để tái sử dụng ở những lần sử dụng sau:
+ Thông tin cá nhân trong hóa đơn thanh toán
+ Thông tin Username & Password 
+ ...

Cơ chế hoạt động của Cookie
- Browser và Server trao đổi cookie khi có request đến một page bất kỳ trong cùng một site (domain)
- Browser quản lý không cho cookie trong domain này truyền đến domain khác 
- Số lượng file cookie trong một domain có giới hạn (IE -20 files)

co-che-hoat-dong-cua-cookie.jpg

HttpCookie

- Lớp đối tượng quản lý thông tin Cookie trong ASP.NET
- Các thuộc tính của HttpCookie
+ Name : tên của Cookie
+ Value : Giá trị của Cookie
+ Domain : domain cookie này thuộc về.
+ Expires : xác định thời gian có hiệu lực của Cookie
+ HasKeys : Cookie có tập giá trị con hay không
+ Values : tập các giá trị của Cookie

Sử dụng Cookies

- Ghi cookies
Response.Cookies[cookie][(key)|.attribute] = value;
• cookie: tên biến
• key : tham số tùy chọn, có thể đặt nhiều giá trị cho 1 cookie
• attribute: thuộc tính (domain, path,....)
- Đọc giá trị cookies
value = Request.Cookies[cookie][(key)|.attribute]

Ví dụ - Cookies đơn
- Ghi
Response.Cookies["userName"].Value = "DOTNET";
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);
- Đọc
if (Request.Cookies["userName"] != null)
LabelUsername.Text = Request.Cookies["userName"].Value;
- Xóa
Response.Cookies["userName"].Expires=DateTime.Now.AddDays(-1); 

Ví dụ - Cookies có các subkey
- Ghi
Response.Cookies["userInfo"]["userName"] = "DOTNET";
Response.Cookies["userInfo"]["lastVisit"]=DateTime.Now.ToString(); 
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
- Đọc
if (Request.Cookies["userInfo"] != null) {
LabelUsername.Text = Request.Cookies["userInfo"]["userName"]; 
LabelLastVisit.Text = Request.Cookies["userInfo"]["lastVisit"];
}
- Xóa
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(-1);

Ví dụ - HttpCookie
- Ghi
HttpCookie cookie = new HttpCookie("userInfo"); 
cookie["userName"] = "DOTNET";
cookie["lastVisit"] = DateTime.Now.ToString(); 
cookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(cookie);
- Đọc
HttpCookie cookie = Request.Cookies["userInfo"]; 
if (cookie != null) {
LabelUsername.Text = cookie["userName"]; 
LabelLastVisit.Text = cookie["lastVisit"];
}
2.2 Server-based State
- Là các đối tượng trạng thái được lưu trữ ở máy Server
- Bao gồm
+ Session
+ Application

Session

- Một phiên làm việc (session) là một chuỗi các thao tác của ngươi dùng trên cùng một Web application
- Với mỗi phiên làm việc của client, sẽ có một Session Object được tạo ra,
+ Được lưu trữ trên server
+ Cung cấp những thông tin về phiên làm việc hiện hành của client
+ Được duy trì khi người dùng duyệt từ WebForm sang WebForm khác trong cùng một site
+ Bị hủy khi:
• Người dùng tường minh thoát khỏi session
• Sau một khoảng thời gian (time-out) , mặc định là 20 phút

Sử dụng Session

- Khởi tạo/ Gán giá trị cho biến Session
Session["name"] = value;
- Đọc dữ liệu từ biến Session
Object obj = (Object)Session["name"];
- Qui định khoảng thời gian tồn tại của một phiên làm việc
Session.Timeout = minutes;
- Lấy định danh ID duy nhất của phiên làm việc
Session.SessionID
- Hủy phiên làm việc (hủy cả biến dữ liệu)
Session.Abandon();

Ví dụ - Kiểm tra Quyền đăng nhập

- Làm thế nào để ngăn không cho người dùng truy cập vào các trang web nếu chưa đăng nhập?
- Ý tưởng
+ Dùng các biến Session để lưu trạng thái đăng nhập của người dùng:
Session[“IsLogin”] = 0/1 : Lưu trạng thái đăng nhập 
Session[“Username”] : Lưu Tên đăng nhập 
Session[“Authentication”]: Lưu Loại quyền đăng nhập 
...

Làm thế nào để ngăn không cho người dùng truy cập vào các trang web nếu chưa đăng nhập?
1. Khởi tạo giá trị mặc định cho biến Session[“IsLogin”] = 0 (chưa đăng nhập)

//global.asax
<script language="C#" runat="server">
void Session_OnStart(Object sender, EventArgs E) {
Session["IsLogin"] = 0;
}
</script> 
 
2. Tạo trang Login.aspx cho phép người dùng đăng nhập
- Nếu kiểm tra thông tin đăng nhập không đúng thì hiển thị thông báo yêu cầu đăng nhập lại.
- Ngược lại, nếu ĐÚNG thì dùng một (hoặc nhiều) biến Session để lưu trạng thái login thành công lại.

//Login.aspx.cs
void btnLogin_Click(Object Src, EventArgs E) {
if ([Thong tin dang nhap dung]) 
Session ["IsLogin"] = 1;
else
Response.Write("Vui lòng nhập lại!");
}

Trong tất cả các trang muốn bảo mật, kiểm tra người dùng đã login hay chưa, nếu chưa thì redirect lại trang login.aspx

//MyForm.aspx.cs
void Page_Load(Object Src, EventArgs E){ 
int nDaDangNhap = (Int32) Session ["IsLogin"];
if (nDaDangNhap == 0)
Response.Redirect("Login.aspx");
}

4. Tạo xử lý khi người dùng logout 
- Reset trạng thái login là chưa đăng nhập

//MyForm.aspx.cs 
void btnLogout_Click(Object Src, EventArgs E){ 
Session ["IsLogin"]  = 0;
Response.Redirect("Login.aspx");
}
Application

- Quản lý dữ liệu dùng chung trong cùng một ứng dụng web
- Được lưu trữ trên server
- Có thể truy xuất bởi tất cả các session trong site
- Tồn tại trong suốt chu trình sống của ứng dụng web

Đọc và Ghi Application
- Ghi thông tin
Application["SiteRequestCount”] = 0; 
Application["SiteName"] = "www.dotnet.vn";
- Đọc nội dung từ Application State
int count = (int)Application["SiteRequestCount"]; 
string name = (string)Application["SiteName"];
Xử lý vấn đề truy xuất đồng thời Application

- Lock application state để hạn chế lỗi xảy ra do việc truy xuất đồng thời bởi nhiều client request
Application.Lock();
if (Application["SiteRequestCount"] == null)
{
Application["SiteRequestCount"] = 0;
}
count = (int)Application[nSiteRequestCount"]; 
count++;
Application[nSiteRequestCount"] = count; 
Application.UnLock(); 
Khởi tạo Application

- Khởi tạo biến Application trong file Global.asax
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup Application["SiteRequestCount"] = 0; 
Application["SiteName"] = "www.dotnet.vn";
}
</script> 

Ví dụ - Đếm số lần duyệt 1 trang web
//global.asax
<script language="C#" runat="server">
void Application_OnStart(Object sender, EventArgs E) { 
Application["SoLan"] = 0;
}
</script>
//Myform.aspx.cs
void Page_Load(Object Src, EventArgs E){
Application.Lock() ;
Application["SoLanf'] = (Int32) Application ["SoLan"] + 1; 
Application.UnLock() ;
Response.Write("Số lần vào trang này :" + Application["SoLan"]);
}

3. Cache
- Cache là một vùng bộ nhớ trên server/client/proxy lưu trữ các thông tin thường xuyên sử dụng của ứng dụng web để tái sử dụng cho các lần truy cập sau mà không cần xử lý lại
- Do được lưu trữ trong bộ nhớ (memory) nên cho phép truy xuất nhanh chóng
- Nâng cao hiệu năng (performance) của ứng dụng web
- Có thể lưu bất kỳ kiểu dữ liệu nào
- Tôn tại trong khoảng thời gian qui định

Cơ chế Cache

* Có 2 cơ chế Cache
1. Page Output Caching
- Lưu kết quả render trên một WebForm và sử dụng lại ở những lần request sau
+ Lưu toàn bộ WebForm
+ Lưu một phần WebForm
2. Application Data Caching
- Cho phép lập trình lưu các đối tượng trong Cache 

Page Output Caching
- Lưu toàn bộ trang web
+ Thêm chỉ định OutputCache vào đầu trang ASPX
• Duration: Thời gian (second) lưu trang web
• Location: Qui định nơi lưu cache: Any (default), Client, Server, ServerAndClient, DownStream, None
• VaryByParam: Lưu nhiều phiên bản khác nhau của trang web phụ thuộc vào tham số truyền từ querystring
<%@ OutputCache Duration="60" Location="Server" VaryByParam="None" %> <%@ OutputCache Duration="60" VaryByParam="CatId" %>

Page Output Caching
- Lưu một phần trang web
+ Control caching
• Sử dụng Web User Control với chỉ thị OutputCache ở đầu trang ASCX
+ Post-cache substitution
• Thiết lập OutputCache cho toàn bộ trang web
• Qui định những vùng Substitution cho phép thay đổi nội dung 

Ví dụ - Post-cache Substitution

<div id="cartBox">
<h2>Your Shopping Cart</h2>
<asp:Substitution id="subCart" runat="server“ MethodName="GetCart" />
<div>

public static string GetCart(HttpContext context)
{
ShoppingCart cart = (ShoppingCart)context.Session["Cart"];
// Handle missing cart
..
// Output the cart item markup for this session to a string
string output = "";
foreach (CartItem item in cart)
{
output += "<p class='cartRow'>";
output += item.Name + "</p>";
}
return output;
}
Application Data Caching
- Using System.Web.Caching;
- Ghi dữ liệu vào Cache
Book b = new Book(1, "Harry Potter");
Cache["book”] = b;
- Qui định thời gian tồn tại của Cache
Cache.Insert("Book", b, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(2)); // expire sau 2 phút kể từ lần truy cập cuối
Cache.Insert("Book", b, null, DateTime.Now.AddMinutes(2.0), Cache.NoSlidingExpiration); // expire trong vòng 2 phút
- Đọc dữ liệu từ Cache
Book b = (Book)Cache["book”];

Tổng kết
- Client-based State
+ ViewState
+ HiddenField
+ QueryString
+ Cookies
- Server-based State
+ Session
+ Application
- Cache
+ Page Output Caching
+ Application Data Caching

Nguồn bài viết: DOTNET.VN

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML