281 Chương 7: ASP.NET và Web Form Nếu cài đặt IIS sau khi cài đặt Visual Studio .NET hoặc .NET Framework, bạn cần phải "sửa" .NET Framework bằng đĩa cài đặt gốc. Để bắt đầu quá trình này, bạn hãy gõ lệnh sau đây vào cửa sổ dòng lệnh (hoặc cửa sổ Run), nếu đang dùng phiên bản DVD của Visual Studio .NET: <DVD Drive>:\wcu\dotNetFramework\dotnetfx.exe /t:c:\temp /c:"msiexec.exe /fvecms c:\temp\netfx.msi" Nếu đang dùng phiên bản CD của Visual Studio .NET, bạn hãy sử dụng dòng lệnh sau đây cùng với đĩa Windows Component Update: <CD Drive>:\dotNetFramework\dotnetfx.exe /t:c:\temp /c:"msiexec.exe /fvecms c:\temp\netfx.msi" Nếu IIS được cài đặt đúng, bước kế tiếp là xác nhận tính hợp lệ của file Web.config. File Web.config phải có cấu trúc như sau: <configuration> <system.web> <compilation defaultLanguage="c#" debug="true" > <! Bỏ qua các thiết lập khác. > </system.web> </configuration> Theo mặc định, Visual Studio .NET thêm thẻ <compilation> vào file Web.config (được tạo tự động) với đặc tính debug được thiết lập là true . Bước kế tiếp là kiểm tra cấu hình IIS. Vấn đề sẽ xảy ra nếu bạn quên tạo thư mục ảo cho ứng dụng hoặc nếu bạn chạy một ứng dụng sau khi đã gỡ bỏ hoặc chỉnh sửa thư mục ảo của nó. Để khắc phục các vấn đề này, bạn hãy hiệu chỉnh các thiết lập cho thư mục ảo trong IIS Manager bằng cách chọn Control Panel | Administrative Tools | Internet Information Services từ Start Menu. Bạn cần kiểm tra xem thư mục ảo đã tồn tại và được cấu hình là một ứng dụng Web hay chưa (bạn có thể xem các thiết lập cho thư mục ảo bằng cách nhắp phải vào nó và chọn Properties). Ví dụ, thư mục ảo FMStocks7 (xem hình 7.12) đã tồn tại nhưng chưa được cấu hình là một ứng dụng Web. Để giải quyết vấn đề này, bạn chỉ cần nhắp vào nút Create trong phần Application Settings. 282 Chương 7: ASP.NET và Web Form Hình 7.12 Một thư mục ảo không phải là một ứng dụng Web Một vấn đề khác về cấu hình IIS có thể xảy ra trong Visual Studio .NET là không thực hiện xác thực. Visual Studio .NET truy xuất web-server cục bộ bằng Integrated Windows authentication, ngay cả khi bạn đã kích hoạt Anonymous authentication cho thư mục ảo. Điều này nghĩa là thư mục ảo của bạn phải cho phép cả Anonymous authentication và Integrated Windows authentication. Để cho phép cả hai phương pháp này, bạn cần thực hiện các bước sau đây: 1. Trong IIS Manager, nhắp phải vào thư mục ảo cho ứng dụng của bạn và chọn Properties (bạn có thể cấu hình kiểu xác thực cho tất cả các thư mục nếu nhắp phải vào thư mục Web Sites và chọn Properties). 2. Chọn thẻ Directory Security (xem hình 7.13). 3. Trong phần Anonymous access and authentication control, nhắp nút Edit. 4. Trong hộp thoại Authentication Methods, bên dưới Authenticated access, chọn Integrated Windows authentication (xem hình 7.14). 5. Nhắp OK. 283 Chương 7: ASP.NET và Web Form Hình 7.13 Directory Security Hình 7.14 Kích hoạt Integrated Windows authentication 284 Chương 7: ASP.NET và Web Form 17. 17. Thay đ i quy n đã c p cho mã ASP.NETổ ề ấ Thay đ i quy n đã c p cho mã ASP.NETổ ề ấ Bạn cần cấp cho phần mã của trang web hoặc dịch vụ Web của bạn nhiều đặc quyền Windows hơn (như các quyền cho file, thiết lập Registry , cơ sở dữ liệu, và các tài nguyên khác), hoặc bạn cần hạn chế các đặc quyền hiện có. Bạn có thể gán trực tiếp các đặc quyền cho tài khoản ASPNET cục bộ, hoặc có thể cấu hình mã ASP.NET của bạn để sử dụng một tài khoản hoàn toàn khác bằng cách chỉnh sửa thẻ <processModel> trong file machine.config . Bạn cũng có thể sử dụng kỹ thuật giả nhận ( impersonation ) để một đoạn mã thực thi với các quyền của người dùng đã được IIS xác thực. Mã ASP.NET không chạy dưới tài khoản người dùng đã được IIS xác thực hoặc tài khoản nặc danh IUSR_[ServerName]. Một phần lý do là tài khoản này thường không có đủ đặc quyền đối với mã ASP.NET (có thể tạo và xóa các file tạm để quản lý tiến trình biên dịch trang web). Theo mặc định, các trang ASP.NET chạy bằng tài khoản ASPNET cục bộ, tài khoản này có một tập các đặc quyền bị giới hạn. Nếu cần mã ASP.NET của bạn thực hiện điều gì đó không được phép theo mặc định đối với tài khoản cục bộ (chẳng hạn, ghi ra ổ đĩa cứng trên server), bạn có thể cấp các quyền này cho tiến trình ASPNET. Bạn cũng có thể thay đổi thiết lập này bằng cách mở file machine.config (nằm trong thư mục <Windows directory>\Microsoft.NET\ Framework\<version>\CONFIG\) và chỉnh sửa thẻ <processModel> . Hình 7.15 File machine.config Bạn có thể thiết lập các đặc tính userName và password cho một người dùng bất kỳ, hoặc bạn có thể đưa vào sử dụng tiến trình ASPNET cục bộ (thiết lập userName là machine và password là AutoGenerate ) hoặc tài khoản hệ thống cục bộ (thiết lập userName là SYSTEM và password là AutoGenerate ). Vì tài khoản hệ thống cục bộ có có đầy đủ quyền trên máy tính nên đừng bao giờ sử dụng tài khoản này ngoại trừ mục đích thử nghiệm. Các thiết lập về tài khoản ASP.NET là toàn cục và tất cả các ứng dụng Web sẽ chia sẻ tài khoản mà bạn chỉ định. 285 Chương 7: ASP.NET và Web Form Bạn cũng có thể thay đổi tài khoản dùng để thực thi các ứng dụng hoặc đoạn mã nào đó bằng kỹ thuật giả nhận. Ví dụ, để cấu hình một ứng dụng Web chạy dưới một tài khoản người dùng khác, bạn cần thêm thẻ <identity> vào file Web.config như sau: <configuration> <system.web> <! Bỏ qua các thiết lập khác. > <identity impersonate="true" name="domain\user" password="pwd"/> </system.web> </configuration> Bạn cũng có thể chỉ thị ứng dụng Web sử dụng identity đã được IIS xác thực, đó sẽ là tài khoản nặc danh IUSR_[ServerName] nếu bạn không sử dụng Windows authentication (đã được thảo luận trong mục 7.8). Bạn chỉ cần thêm thẻ <identity> mà không phải thêm bất cứ thông tin xác thực nào: <identity impersonate="true"/> Nhớ rằng, đối với kiểu giả nhận này, tài khoản người dùng sẽ yêu cầu truy xuất đọc/ghi đến thư mục Temporary ASP.NET Files (nơi lưu trữ các file ASP.NET đã được biên dịch—được định vị tại \[WindowsDirectory]\Microsoft.NET\Framework\ [version]\Temporary ASP.NET Files). Cuối cùng, bạn cũng có thể sử dụng kỹ thuật giả nhận bằng mã lệnh (vấn đề này sẽ được mô tả chi tiết trong mục 13.15). Tuy vậy, ví dụ dưới đây sẽ làm việc cùng với Windows authentication. Nếu IIS đã xác thực người dùng (được mô tả trong mục 7.8), identity đó sẽ được thừa nhận khi sử dụng phương thức WindowsIdentity.Impersonate . Để sử dụng đoạn mã này, bạn phải nhập không gian tên System.Security.Principal . if (User.GetType() == typeof(WindowsPrincipal)) { WindowsIdentity id = (WindowsIdentity)User.Identity; WindowsImpersonationContext impersonate = id.Impersonate(); // (Thực hiện các tác vụ với ID này.) // Trả lại ID. impersonate.Undo(); } else { // Người dùng không được xác thực. // Ném lỗi hoặc thực hiện các bước khác. } 286 Chương 7: ASP.NET và Web Form 8 287 Chương 8:ĐỒ HỌA, ĐA PHƯƠNG TIỆN, VÀ IN ẤN 288 289 Chương 8: Đồ họa, đa phương tiện, và in ấn ồ họa, video, audio, và in ấn là những dấu hiệu tiêu chuẩn của một client đa năng truyền thống trên hệ điều hành Microsoft Windows. Khi tiến đến đa phương tiện, Microsoft .NET Framework hỗ trợ cho vài đặc tính này, trong khi bỏ qua các đặc tính khác. Ví dụ, bạn sẽ tìm thấy một tập phức tạp các công cụ dùng để thực hiện việc vẽ trong không gian hai chiều và việc in dựa-trên-sự-kiện với GDI+ và các kiểu thuộc không gian tên System.Drawing . Các lớp này hỗ trợ các hàm Graphics Device Interface (GDI) nguyên sinh trong Windows API; khiến cho việc vẽ các hình dạng phức tạp, làm việc với tọa độ và phép biến hình, và xử lý ảnh dễ dàng hơn. Mặt khác, nếu bạn muốn chơi một file audio, hiển thị một file video, hoặc lấy thông tin về các tác vụ in hiện thời, bạn sẽ cần phải vượt ra ngoài .NET Framework. Đ Các đề mục trong chương này trình bày cách sử dụng các đặc tính nội tại .NET và các thư viện Win32 nguyên sinh thông qua P/Invoke hoặc COM Interop. Một vài kỹ thuật sẽ được đề cập: Tìm và sử dụng các font đã được cài đặt (mục 8.1), vẽ hình cuộn được (mục 8.5) và thumbnail (mục 8.8), cũng như thực hiện chụp màn hình bằng Win32 API (mục 8.6). Làm việc với các điều kiểm tùy biến owner-drawn (mục 8.3 và 8.4) và xử lý các đối tượng đồ họa trên màn hình (mục 8.2 và 8.7). Chơi các file audio và video (bao gồm WAV, MP3, và MPEG) bằng thư viện Quartz có trong Windows Media Player (mục 8.9, 8.10, và 8.11). In các văn bản đơn giản và phức tạp (mục 8.13 và 8.14), in text với wrapping (mục 8.15), tạo print preview (mục 8.16), và lấy thông tin về máy in (mục 8.12) và hàng đợi in bằng WMI (mục 8.17). 1. 1. Tìm t t c các font đã đ c cài đ tấ ả ượ ặ Tìm t t c các font đã đ c cài đ tấ ả ượ ặ Bạn cần lấy danh sách tất cả các font đã được cài đặt trên máy tính hiện hành. Tạo đối tượng System.Drawing.Text.InstalledFontCollection , tập hợp này chứa các đối tượng FontFamily mô tả tất cả các font đã được cài đặt. Lớp InstalledFontCollection cho phép bạn lấy thông tin về các font đã được cài đặt. Đoạn mã dưới đây duyệt qua tập hợp font vừa được tạo; mỗi khi tìm thấy một font, nó sẽ tạo một Label mới để hiển thị tên font với diện mạo cho trước (kích thước 14 point). Label được thêm vào một Panel cuộn được, cho phép người dùng cuộn qua danh sách các font hiện có. using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Text; public class ListFonts : System.Windows.Forms.Form { private System.Windows.Forms.Panel pnlFonts; 290 Chương 8: Đồ họa, đa phương tiện, và in ấn // (Bỏ qua phần mã designer.) private void ListFonts_Load(object sender, System.EventArgs e) { // Tạo tập hợp font. InstalledFontCollection fontFamilies = new InstalledFontCollection(); // Duyệt qua tất cả các font. int offset = 10; foreach (FontFamily family in fontFamilies.Families) { try { // Tạo một Label để hiển thị text (viết ở font này). Label fontLabel = new Label(); fontLabel.Text = family.Name; fontLabel.Font = new Font(family, 14); fontLabel.Left = 10; fontLabel.Width = pnlFonts.Width; fontLabel.Top = offset; // Thêm Label vào Panel cuộn được. pnlFonts.Controls.Add(fontLabel); offset += 30; }catch { // Lỗi sẽ xảy ra nếu font được chọn không // hỗ trợ normal style (mặc định được sử dụng khi // tạo đối tượng Font). Vấn đề này có thể // được bỏ qua mà không sao cả. } } } } . hoặc lấy thông tin về các tác vụ in hiện thời, bạn sẽ cần phải vượt ra ngoài .NET Framework. Đ Các đề mục trong chương này trình bày cách sử dụng các đặc tính nội tại .NET và các thư viện Win32. Windows hơn (như các quyền cho file, thiết lập Registry , cơ sở dữ liệu, và các tài nguyên khác), hoặc bạn cần hạn chế các đặc quyền hiện có. Bạn có thể gán trực tiếp các đặc quyền cho. bỏ hoặc chỉnh sửa thư mục ảo của nó. Để khắc phục các vấn đề này, bạn hãy hiệu chỉnh các thiết lập cho thư mục ảo trong IIS Manager bằng cách chọn Control Panel | Administrative Tools | Internet