Tải bản đầy đủ (.pdf) (10 trang)

Các giải pháp lập trình CSharp- P28 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.62 MB, 10 trang )

271
Chương 7: ASP.NET và Web Form
Điều kiểm người dùng là các nhóm điều kiểm độc lập. Như Web Form, điều kiểm người dùng
bao gồm phần layout định nghĩa các điều kiểm bên trong (file .ascx) và phần code-behind
cùng với logic thụ lý sự kiện (file .cs). Điều kiểm người dùng cho phép bạn sử dụng lại các
phần tử giao diện thông thường trên nhiều trang và tạo dựng các giao diện phức tạp từ các
khối nhỏ hơn. Một đặc điểm hữu ích của điều kiểm người dùng là chúng có thể được nạp bằng
mã lệnh, điều này cho phép bạn tạo một giao diện cấu hình cao do bạn thiết kế động y theo
người dùng. Bạn chỉ cần nạp điều kiểm, cấu hình các thuộc tính của nó, và rồi thêm nó vào
một điều kiểm container.
Ví dụ, xét trang web đã tạo động các bức hình trong mục 7.12. Một giải pháp theo cách hướng
đối tượng hơn có thể hiện thực được là tạo một điều kiểm người dùng tùy biến đóng gói bức
hình được-tạo-động. Điều kiểm người dùng này cho phép trang thiết lập text, font, màu
thông qua các thuộc tính khác nhau.
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
public class DynamicGraphicControl : System.Web.UI.UserControl {
// (Bỏ qua phần mã designer.)
private string imageText = "";
public string ImageText {
get {
return imageText;
}
set {
imageText = value;
}
}
private Font textFont;


public Font TextFont {
get {
return textFont;
}
set {
textFont = value;
}
272
Chương 7: ASP.NET và Web Form
}
private Size imageSize;
public Size ImageSize {
get {
return imageSize;
}
set {
imageSize = value;
}
}
private Color foreColor;
public Color ForeColor {
get {
return foreColor;
}
set {
foreColor = value;
}
}
private Color backColor;
public Color BackColor {

get {
return backColor;
}
set {
backColor = value;
}
}
private Color borderColor;
public Color BorderColor {
get {
273
Chương 7: ASP.NET và Web Form
return borderColor;
}
set {
borderColor = value;
}
}
private void Page_Load(object sender, System.EventArgs e) {
if (ImageText == "")
return;
// Tạo một hình bitmap trong-bộ-nhớ.
Bitmap bitmap = new Bitmap(ImageSize.Width, ImageSize.Height);
// lấy graphics context của hình bitmap.
Graphics graphics = Graphics.FromImage(bitmap);
// Thiết lập màu nền và chất lượng hình.
// Màu này sẽ trở thành đường viền.
graphics.Clear(BorderColor);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
// Vẽ một hình chữ nhật.

graphics.FillRectangle(new SolidBrush(BackColor), 5, 5,
ImageSize.Width - 10, ImageSize.Height - 10);
// Thiết lập alignment cho text.
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
// Vẽ text.
graphics.DrawString(ImageText, TextFont,
new SolidBrush(ForeColor),
new Rectangle(0, 0, ImageSize.Width, ImageSize.Height),
stringFormat);
274
Chương 7: ASP.NET và Web Form
// Lưu bức hình vào dòng kết xuất.
bitmap.Save(Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Gif);
graphics.Dispose();
bitmap.Dispose();
}
}
Web Form nạp điều kiểm người dùng này trong phương thức thụ lý sự kiện
Page.Load
. Điều
kiểm người dùng được đặt trong một
Panel
. Phương thức
LoadControl
trả về một đối tượng
Control
, và nó được ép kiểu thành lớp điều kiểm người dùng thích hợp.

using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
public class DynamicControlTest : System.Web.UI.Page {
protected System.Web.UI.WebControls.Panel pnl;
// (Bỏ qua phần mã designer.)
private void Page_Load(object sender, System.EventArgs e) {
// Nạp điều kiểm.
DynamicGraphicControl ctrl;
ctrl = (DynamicGraphicControl)
Page.LoadControl("DynamicGraphicControl.ascx");
// Cấu hình các thuộc tính của điều kiểm.
ctrl.ImageText = "This is a new banner test";
ctrl.ImageSize = new Size(300, 200);
ctrl.TextFont = new Font("Verdana", 24, FontStyle.Bold);
ctrl.BackColor = Color.Olive;
ctrl.ForeColor = Color.LightYellow;
ctrl.BorderColor = Color.OrangeRed;
275
Chương 7: ASP.NET và Web Form
// Thêm điều kiểm vào Panel.
pnl.Controls.Add(ctrl);
}
}
Trong Visual Studio .NET, lớp điều kiểm người dùng luôn có hiệu lực vì các lớp đã được biên
dịch thành .dll. Tuy nhiên, nếu điều kiểm người dùng không phải một bộ phận của dự án, bạn
sẽ không có lớp điều kiểm người dùng và bạn sẽ không thể truy xuất bất kỳ thuộc tính hay
phương thức nào của điều kiểm người dùng. Để khắc phục vấn đề này, bạn có thể tạo một lớp
cơ sở hoặc một giao diện định nghĩa các chức năng cơ bản để có thể truy xuất vào bất kỳ điều

kiểm người dùng tùy biến nào.

Để tìm hiểu kỹ hơn về kỹ thuật này, bạn hãy download
IBuySpy portal case study
tại
[
/>]
. Nó trình bày một layout khả-tùy-biến-cao
được tạo dựng hoàn toàn từ các điều kiểm người dùng được-nạp-động.
14.
14.
S d ng page-caching và fragment-cachingử ụ
S d ng page-caching và fragment-cachingử ụ


Bạn cần tăng hiệu năng bằng cách lưu giữ các trang được trả về.


Thêm chỉ thị
OutputCache
vào trang hoặc điều kiểm người dùng, và chỉ định
trang sẽ được giữ trong cache bao lâu (tính theo giây).
Việc sử dụng caching vừa phải có thể giảm bớt hiệu ứng thắt cổ chai (chẳng hạn, truy xuất cơ
sở dữ liệu) và tăng toàn bộ hiệu năng của một website. Caching có hiệu quả lớn trong một site
có lưu lượng cao. Ví dụ, xét xem điều gì sẽ xảy ra khi bạn lưu giữ một trang hiển thị kết quả
của một truy vấn cơ sở dữ liệu. Nếu bạn lưu giữ trang này trong 1 phút, và trang này nhận
được 10 yêu cầu trong khoảng thời gian đó, bạn sẽ giảm được 10 lần chi phí truy xuất cơ sở
dữ liệu.
Bạn có thể hiện thực caching một cách dễ dàng—chỉ cần thêm chỉ thị
OutputCache

vào trang
web. Chỉ thị này phải được thêm vào file .aspx, chứ không phải file .cs. Ví dụ dưới đây lưu
giữ một trang trong 20 giây:
<%@ OutputCache Duration="20" VaryByParam="None" %>
Và ví dụ dưới đây lưu giữ một trang trong 20 giây nhưng vẫn duy trì các bản sao tùy vào giá
trị của các đối số chuỗi truy vấn:
<%@ OutputCache Duration="20" VaryByParam="*" %>
Bạn có thể thử nghiệm caching bằng một trang hiển thị ngày và giờ trên server. Bạn sẽ nhận
thấy rằng các yêu cầu đến sau (đối với trang này) không khiến cho thời gian được tạo mới.
Theo đó, thời gian cũ sẽ được hiển thị cho đến khi trang hết hiệu lực.
Output-caching không hiệu quả trong các trường hợp sau đây:

Trang của bạn cần tự tùy biến y theo các thiết lập đặc thù của người dùng như thông tin
xác thực (đối tượng
User
) hoặc trạng thái (đối tượng
Session
). Trong trường hợp này,
nó không tạo cảm giác sử dụng lại cùng một trang cho tất cả các người dùng.
276
Chương 7: ASP.NET và Web Form

Trang của bạn chứa các điều kiểm post-back và dựng nên các sự kiện phía server.

Trang của bạn cần thực hiện một hành động khác (như ghi ra file nhật ký, nhập thông
tin vào cơ sở dữ liệu, hoặc thay đổi một biến ứng dụng). Một trang được lưu giữ sẽ sử
dụng lại toàn bộ HTML đã được trả về; phần mã cho trang bị bỏ qua.

Trang của bạn có chứa các dữ liệu cần phải được tạo cùng với các dữ liệu hiện hành.
Đây là trường hợp đối với tìm kiếm sản phẩm, nhưng không phải là trường hợp đối với

danh mục sản phẩm.
Trong các trường hợp này, bạn có thể sử dụng một dạng caching linh hoạt hơn. Bạn có thể sử
dụng data-caching (sẽ được mô tả trong mục 7.15) để lưu giữ một đối tượng cụ thể. Hoặc bạn
có thể sử dụng fragment-caching để lưu giữ một phần của trang. Để sử dụng fragment-
caching, bạn cần tạo một điều kiểm người dùng chứa tất cả nội dung có thể được lưu giữ và
thêm chỉ thị
OutputCache
vào điều kiểm người dùng. Khi đó, bạn có thể sử dụng điều kiểm
người dùng này trong một trang web. Phần mã cho trang web vẫn sẽ chạy, nhưng phần điều
kiểm người dùng có thể được lưu giữ.
15.
15.
Dùng l i d li u v i ASP.NET ạ ữ ệ ớ
Dùng l i d li u v i ASP.NET ạ ữ ệ ớ
Cache
Cache


Bạn cần sử dụng caching, nhưng bạn không thể lưu giữ toàn bộ một trang vì nó
chứa một số mã cần phải chạy hoặc một số nội dung cần phải được tạo động.


Sử dụng phương thức
Cache.Insert
để lưu giữ bất kỳ đối tượng nào với chính
sách hết hiệu lực trượt (
sliding

expiration
)


hoặc hết hiệu lực tuyệt đối (
absolute
expiration
).
Đối tượng
Cache
cho phép bạn lưu giữ hầu như bất kỳ đối tượng .NET nào bằng một khóa
chuỗi cùng với chính sách hết hiệu lực do bạn định nghĩa. ASP.NET duy trì cache một cách tự
động, gỡ bỏ các đối tượng khi chúng hết hiệu lực hoặc khi cạn bộ nhớ.
Có hai kiểu chính sách hết hiệu lực bạn có thể sử dụng khi lưu giữ dữ liệu trong cache. Hết
hiệu lực tuyệt đối (absolute expiration) làm mất hiệu lực các item đã được lưu giữ sau một
khoảng thời gian cố định, gần giống với output-caching. Hết hiệu lực tuyệt đối là cách tiếp
cận tốt nhất nếu bạn muốn lưu giữ các thông tin cần được làm tươi định kỳ (như danh mục sản
phầm).
// Lưu giữ ObjectToCache trong 10 phút (với khóa là "Catalog").
// TimeSpan.Zero cho biết "không sử dụng sliding expiration".
Cache.Insert("Catalog", ObjectToCache, null,
DateTime.Now.AddMinutes(10), TimeSpan.Zero);
Hết hiệu lực trượt (sliding expiration) gỡ bỏ các đối tượng sau một khoảng thời gian không
dùng đến. Trong trường hợp này, mỗi khi đối tượng được truy xuất, thời gian sống của nó sẽ
được reset. Hết hiệu lực trượt làm việc tốt khi bạn có các thông tin luôn có hiệu lực nhưng
luôn không được sử dụng (như dữ liệu thuộc về quá khứ). Thông tin này không cần được làm
tươi, nhưng không nên giữ nó trong cache nếu nó không được sử dụng.
277
Chương 7: ASP.NET và Web Form
// Lưu giữ ObjectToCache nếu nó được sử dụng ít nhất
// một lần mỗi 10 phút (với khóa là "Catalog").
// DateTime.MaxValue cho biết "không sử dụng absolute expiration".
Cache.Insert("Catalog", ObjectToCache, null,

DateTime.MaxValue, TimeSpan.FromMinutes(10));
Bạn có thể lấy các item từ cache bằng tên khóa. Tuy nhiên, bạn phải luôn kiểm tra trước xem
item có tồn tại hay không và rồi ép nó thành kiểu như mong muốn.
Khi thêm các đối tượng vào cache, cách tốt nhất là tạo một hàm độc lập có thể tái tạo đối
tượng khi cần. Ví dụ, nếu đang lưu giữ một
DataSet
, bạn cần tạo một hàm kiểm tra cache và
chỉ truy vấn lại cơ sở dữ liệu khi không tìm thấy
DataSet
. Điều này cho phép bạn tránh đi
phần xử lý tốn nhiều thời gian nhất—truy vấn cơ sở dữ liệu—trong khi vẫn cho phép mã lệnh
của bạn thay đổi hiển thị (chẳng hạn, người dùng yêu cầu sắp thứ tự) hoặc thực hiện các hành
động khác.
Ví dụ dưới đây sẽ hiển thị một bảng chứa thông tin về khách hàng được lấy từ một
DataSet
.
Phần then chốt là lớp
CustomerDatabase
, đóng gói các chức năng cần thiết để đổ dữ liệu vào
DataSet
và quản lý cache. Vì lớp này không thừa kế từ
Page
nên nó cần sử dụng thuộc tính
tĩnh
HttpContext.Current
để lấy 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;
// Lấy tham chiếu đến đối tượng Cache.
private Cache cache = HttpContext.Current.Cache;
public CustomerDatabase() {

// Lấy chuỗi kết nối từ file Web.config.
connectionString =
ConfigurationSettings.AppSettings["NorthwindCon"];
}
278
Chương 7: ASP.NET và Web Form
public DataSet GetCustomers() {

DataSet customersDS;
// Kiểm tra item có nằm trong cache hay không.
if (cache["Customers"] == null) {

// Lấy DataSet từ cơ sở dữ liệu.
customersDS = GetCustomersFromDatabase();

// Lưu giữ item trong cache
// cùng với sliding expiration là 60 giây.
cache.Insert("Customers", customersDS, null,
DateTime.MaxValue, TimeSpan.FromSeconds(60));

// Hiển thị thông điệp trong cửa sổ Debug.
Debug.WriteLine("DataSet created from data source.");
}else {

// Hiển thị thông điệp trong cửa sổ Debug.
Debug.WriteLine("DataSet retrieved from cache.");

// Lấy item.
customersDS = (DataSet)cache["Customers"];
}
// Trả về DataSet.
return customersDS;
}
private DataSet GetCustomersFromDatabase() {

// Tạo DataSet.
DataSet customersDS = new DataSet();
279
Chương 7: ASP.NET và Web Form

// Đổ dữ liệu 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à tạo một trang web sử dụng lớp
CustomerDatabase
. Trang web dưới đây gồm
một
DataGrid
và một
Button
. Mỗi khi người dùng nhắp vào
Button
, trang sẽ gọi phương thức
CustomerDatabase.GetCustomers
. Thông tin được lấy từ cache nếu vẫn còn hiệu lực hoặc
được truy vấn lại nếu 60 giây đã trôi qua. Bạn có thể nhận biết
DataSet
có được lấy từ cache
hay không bằng cách nhìn vào kết xuất trong cửa 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 phần mã designer.)
private void cmdGetData_Click(object sender, System.EventArgs e){
CustomerDatabase custDB = new CustomerDatabase();
DataGrid1.DataSource = custDB.GetCustomers();
DataGrid1.DataBind();

}
280
Chương 7: ASP.NET và Web Form
}
16.
16.
Kích ho t vi c g r i ng d ng Webạ ệ ỡ ố ứ ụ
Kích ho t vi c g r i ng d ng Webạ ệ ỡ ố ứ ụ


Khi thực hiện gỡ rối một ứng dụng
Web
với
Visual Studio .NET
, bạn nhận được
lỗi “
Unable to start debugging on the Web server
”.


Bảo đả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 hoạt cho thư mục chứa ứng dụng
Web
.
Hình 7.11
Lỗi “Unable to start debugging on the Web server”
Lỗi “Unable to start debugging on the Web server” cho biết rằng Visual Studio .NET có thể
biên dịch ứng dụng Web nhưng không thể thực thi nó ở chế độ gỡ rối (debug mode). Vấn đề
này phát sinh vì nhiều lý do:

IIS chưa được cài đặt hoặc cài đặt không đúng.

Người dùng đang chạy Visual Studio .NET không phải là thành viên của nhóm
Debugger Users trên web-server.

Người dùng đang chạy Visual Studio .NET không có quyền (permission) gỡ rối tiến
trình ASP.NET. Ví dụ, nếu tiến trình ASP.NET đang chạy dưới tài khoản hệ thống cục
bộ, người dùng phải có đặc quyền Administrator thì mới có thể gỡ rối nó.

Web-server đang chạy trên phiên bản Windows không hỗ trợ gỡ rối, như Microsoft
Windows NT và Windows XP Home Edition (Windows 2000, Windows XP Professional,
Windows XP Server, và Windows Server 2003 đều hỗ trợ gỡ rối).

Ứng dụng Web không có file Web.config, hoặc file Web.config không kích hoạt gỡ rối.

Bạn đang chạy Visual Studio .NET, và bạn không kích hoạt Integrated Windows
authentication cho thư mục ảo.
Bước đầu tiên bạn cần thực hiện khi chẩn đoán lý do không thể gỡ rối một ứng dụng Web là
kiểm tra việc cài đặt IIS trên web-server. Để thực hiện điều này, bạn hãy mở

http://localhost/localstart.asp
trong trình duyệt (
localhost
là một bí danh cho máy tính hiện
hành). Nếu trang thử nghiệm này không xuất hiện thì có nghĩa là IIS không được cài đặt hoặc
không được kích hoạt. Bạn cũng có thể bắt đầu ứng dụng Web mà không thực hiện gỡ rối
bằng cách chọn Debug | Start Without Debugging từ thanh trình đơn của Visual Studio .NET.
Nếu thử nghiệm này thành công thì có nghĩa là IIS đã được cài đặt đúng.

×