VIEWSTATE LÀ GÌ

*

*

ViewState đã không thể là cơn ác mộng đối với những asp.net web forms developer


Trong chủ đề mình muốn nhắc đến các bạn về Việc ViewState đang không thể là cơn ác mộng đối với chúng ta và các xây dựng viên asp.net website forms. Như họ đã biết, ViewState là một trong kĩ năng cực kì đặc biệt quan trọng trong nền tảng gốc rễ trở nên tân tiến web asp.net website forms. Vậy vì sao nó lại quan trọng đặc biệt nhỏng vậy? Để đi sâu về phần tư tưởng ViewState cụ thể, bạn thích nói lại khái niệm asp.net website forms một ít. Asp.Net website forms được ra đời hồi tháng 1 năm 2002 với việc phiên bạn dạng trước tiên của .NET Framwork thành lập và hoạt động. Nó lưu lại câu hỏi trở nên tân tiến web theo một hướng new với theo một framework bình thường .NET Framework. Hướng mới ở đấy là trở nên tân tiến web theo hướng sự kiện giống hệt như thiết kế theo kiểu Visual Basic 6.0 và Windows Forms. Như vậy có thể góp lập trình viên cải cách và phát triển website hết sức nkhô nóng cùng mang tính mở rộng cao ví dụ là giả dụ bạn có nhu cầu thiết kế bên trên Button các bạn chỉ cần chế tạo ra một trình cách xử trí sự khiếu nại tiếp đến viết code trong những số ấy nhằm xử trí gì đấy.

Bạn đang xem: Viewstate là gì

Tại sao Microsoft lại ra quy mô phát triển web theo phía sự kiện vào mức đó? Theo mình suy nghĩ Microsoft đã đi được nước cờ thông minh là trước đây người tiêu dùng đã có lần quen với vấn đề cách tân và phát triển Windows Forms bên trên Visual Basic 6.0 và Windows Forms bên trên nền tảng gốc rễ .NET. Như vậy góp cho các lập trình sẵn viên Windows tiếp cận nkhô nóng đối với vấn đề phát triển website. Chính vì chưng Ra đời quy mô cải tiến và phát triển theo phía sự kiện này vì vậy mô hình các asp.net hệ thống control bắt đầu thành lập. Asp.net server controls tập phù hợp những controls được chạy xe trên hệ thống đã có được gói gọn một cân nặng tính năng phong phú trong những số ấy. Thực hóa học những asp.net VPS controls đó là các đoạn mã html được đóng gói cùng lập trình sẵn trong những số ấy với sẽ tiến hành thay đổi sang mã html sau khi trnghỉ ngơi về phía tín đồ dùng(client-side) sau đó 1 vòng đời cách xử lý trang của asp.net web forms. Mình sẽ không nói rõ về vòng đời giải pháp xử lý trang ở chỗ này bạn cứ phát âm là tập thích hợp các loại sự khiếu nại và quy trình để giải pháp xử lý một trang trong asp.net web forms. Chính vị asp.net server controls thành lập và hoạt động cũng kéo theo ViewState thành lập. Mặc định Lúc trả về đoạn mã html làm việc phía client, Lúc họ thay đổi trạng thái của các html phía client(ví dụ như bọn họ mong bắt sự khiếu nại change của select tag), phía server băn khoăn trạng thái của những hệ thống controls sẽ đổi khác xuất xắc không trường hợp không tồn tại tác dụng ViewState. ViewState là bản lĩnh nhằm lưu trữ và giữ lại trạng thái của các VPS controls nhằm asp.net web forms biết để xử lý bên trên VPS. Nếu không có khả năng này thì lúc người tiêu dùng postbachồng dữ liệu mang lại sever web, thì asp.net website forms trù trừ tâm trạng của các VPS controls đã đổi khác giỏi chưa. Tại sao asp.net có thể duy trì được tinh thần của những VPS controls? Mặc định tất cả các dữ liệu ViewState của những server controls sẽ tiến hành lưu trữ sống phía client vào một hidden field cùng với đoạn mã dữ liệu đã có mã hóa theo Base64. Và sẽ được asp.net website forms giải mã lại cùng cập nhật lại tâm trạng đã có được biến hóa do người tiêu dùng lúc chúng ta postbachồng tài liệu về phía máy chủ web.

Mặc mặc dù ViewState là công dụng tuyệt vời và hoàn hảo nhất của asp.net website forms cơ mà song tuy vậy với đó nó lâu dài một số sự việc performance của asp.net website forms. Việc lạm dụng rất nhiều asp.net server controls rất có thể có tác dụng tăng form size của ViewState tốt nhất là những hệ thống controls nặng trĩu ViewState như GridView, DataList, v.v... Việc size ViewState càng ngày càng tăng vẫn làm tác động không ít tới performance của asp.net web forms với mang trong mình một số điểm vô ích sau đây:

Tăng chi phí đường truyền. => Tốn những ngân sách đến đường truyền. Rủi ro về bảo mật dữ liệu ViewState. => Bởi vì chưng mang định tài liệu ViewState mã hóa theo chuẩn chỉnh Base64. Theo chuẩn này hoàn toàn có thể giải mã một cách thuận tiện. Trang website chậm rì rì rộng. => Bởi bởi vì tài liệu ViewState nặng nề có thể làm cho trình chu đáo download trang web chậm trễ hơn.

Tại trên đây chúng ta chỉ rất có thể khắc chế điểm có hại về bảo mật dữ liệu ViewState, chúng ta có thể mã hóa ViewState.bằng directive EnableViewStateMac của asp.net web forms để tài liệu ViewState nặng nề được giải thuật. Mặc mặc dù vậy họ cũng không cứng cáp về đoạn dữ liệu ViewState được lưu giữ sinh hoạt phía client dành được bảo mật hoàn toàn hay là không.

Để vật chứng mang lại điều này bản thân mang một ví dụ nho nhỏ tuổi. Giả sử mình gồm một trang Default.aspx. Trong trang này một hệ thống control GridView. Control này sẽ binding mang lại list dữ liệu Persons.

Xem thêm: Gia Đình Vui Vẻ Diễn Viên - Diễn Viên 'Gia Đình Vui Vẻ' Ngày Ấy

Default.aspx:


using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Default : System.Web.UI.Page private List GetPersons() var personList = new List(); personList.Add(new Person FirstName = "Phat", LastName = "Ly" ); personList.Add(new Person FirstName = "Lam", LastName = "Ly" ); personList.Add(new Person FirstName = "Tam", LastName = "Chieu" ); personList.Add(new Person FirstName = "Phuc", LastName = "To" ); personList.Add(new Person FirstName = "Phuong", LastName = "Tran" ); personList.Add(new Person FirstName = "Phuong", LastName = "Pham" ); personList.Add(new Person FirstName = "Phuong", LastName = "Nguyen" ); personList.Add(new Person FirstName = "Khanh", LastName = "Pham" ); personList.Add(new Person FirstName = "Viet", LastName = "Pham" ); personList.Add(new Person FirstName = "Minh", LastName = "Ly" ); return personList; protected void Page_Load(object sender, EventArgs e) if (!Page.IsPostBack) gv1.DataSource = GetPersons(); gv1.DataBind();
Bây giờ đồng hồ chúng ta test điều khiển xe trên trình chăm sóc các bạn sẽ thấy đoạn mã ViewState ngơi nghỉ phía client nlỗi hình dưới đây:

*

Với đoạn mã này bạn có thể lời giải chúng bởi việc viết code hay được sử dụng công dụ ViewState decoder online. Ở phía trên bản thân sử dụng vẻ ngoài ViewState decoder online sinh hoạt trang http://ignatu.teo.uk/ViewStateDecoder.aspx để lời giải lại đoạn ViewState của chúng ta:

*

Như họ thấy vào hình trên đoạn tài liệu ViewState của họ đã làm được giải thuật điều này vẫn tàng ẩn khủng hoảng về bảo mật thông tin giả dụ tài liệu nhạy bén hay quan trọng bên trong ViewState không được mã hóa hoàn toàn. Để đoạn tài liệu ViewState của chúng ta bảo mật thông tin rộng bạn có thể thực hiện directive sầu EnableViewStateMac của asp.net website forms và tùy chỉnh thiết lập vào website.config.

Default.aspx


"C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ViewStateWebApplication.Default" EnableViewStateMac="true" %>
quý khách test chạy xe trên trình chu đáo đợt nữa các bạn thấy tài liệu ViewState đã có được mã hóa cùng các bạn ko rất có thể giải thuật theo Base64 nlỗi trườc

*

Như hình bên trên chúng ta đang bảo mật được tài liệu ViewState. Tuy nhiên vấn đề đó cũng ko dĩ nhiên tài liệu của bọn họ bảo mật một phương pháp trọn vẹn. Theo kinh nghiệm của bản thân, bọn họ đề nghị rời lưu bất kể dữ liệu nhạy cảm trong ViewState. Vấn đề này góp họ hạn chế rủi ro khá nhiều trong áp dụng website.

Mặc cho dù tài liệu ViewState được bảo mật thông tin bọn họ vẫn còn đó gặp gỡ 2 điểm bất lợi khác như sẽ nói sống phía trên. Để hạn chế trọn vẹn, bạn cũng có thể lưu trữ và download tài liệu ViewState trực tiếp trên VPS vắt bởi vì phía client. Hiện tại bao gồm vài phương án thực tiễn tiếp sau đây nhằm tiến hành điều này:

Lưu trữ với download dữ liệu ViewState vào Session trên VPS. Giải pháp này chỉ giành cho dữ liệu ViewState vừa cùng bé dại. Lưu trữ cùng mua dữ liệu ViewState vào tập tin ở hệ thống. Lưu trữ cùng sở hữu dữ liệu ViewState vào asp.net cađậy bên trên hệ thống. Lưu trữ với cài đặt dữ liệu ViewState vào distributed caching trên VPS nhỏng memcached, redis...

Do bản thân ko có khá nhiều thời gian, vì vậy tạm thời bản thân kiến thiết một thư viện chỉ góp giải quyết vấn đề lưu trữ cùng sở hữu dữ liệu ViewState vào tập tin vào server mang lại các bạn. Mình vẫn tăng cấp dần dần cùng cung ứng toàn bộ các chiến thuật tốt nhất có thể hiện gồm. Sau đây là sơ đồ kiến thiết của mình:

*

Inteface IViewStateOptimizer: interface này quan niệm 2 phương thức Load và Save sầu dữ liệu ViewState. Abstract class BaseViewStateOptimizer: lớp abstract này triển khai interface IViewStateOptimizer để triển khai tính trừu tượng bình thường cho câu hỏi Load và Save dữ liệu ViewState. Trong lớp này có 2 thủ tục abstract buộc phải tiến hành Khi thừa kế đó là LoadViewStateContents với SaveViewStateContents. Đối cùng với LoadViewStateContents, hàm này đã cài đặt nội dụng ViewState vào trang với các server controls. Còn đối với SaveViewStateContents, hàm này đã lưu giữ tài liệu ViewState cho ở đâu kia. Quý Khách rất có thể thừa kế từ lớp này và triển khai 2 phương thức này để không ngừng mở rộng thư viện này. Class FileViewStateOptimizer: lớp này kế thừa trường đoản cú lớp trừu tượng BaseViewStateOptimizer để tiến hành vấn đề tàng trữ và tải dữ liệu ViewState trong tập tin lên trên server. Abstract Class BaseFileViewStateOptimizerHttpApplication: lớp trừu tượng này tiến hành vấn đề xóa các tập tin sẽ lưu lại Khi session đã hết hạn và kết thúc. Quý khách hàng bắt buộc kế thừa lớp này vào tập tin Global. Class ViewStateOptimizerSecurity: lớp static này tiềm ẩn các cách làm bảo mật đến thư viện ViewStateOptimizer. Class FileViewStateOptimizerOptions: lớp này chứa đựng phần thông số kỹ thuật cho việc tàng trữ và sở hữu dữ liệu ViewState trên server. Class FileViewStateOptimizerPageAdapter: lớp này cấu hình toàn cục cho bài toán biến hóa thủ tục tàng trữ với thiết lập dữ liệu ViewState mang đến tập tin vào VPS. Class SessionViewStateOptimizerPageAdapter: lớp này thông số kỹ thuật toàn bộ mang lại vấn đề thay đổi cách tiến hành lưu trữ với sở hữu tài liệu ViewState mang lại Session bên trên server.

IViewStateOptimizer.cs:


namespace ViewStateOptimizer /// /// This interface defines the implements for optimizing the ViewState. /// public interface IViewStateOptimizer /// /// Loads the ViewState contents. /// void Load(); /// /// Saves the ViewState contents. /// void Save();

namespace ViewStateOptimizer using System; using System.Web.UI; /// /// This abstract class implements as base class for implementing the custom page state persister. /// public abstract class BaseViewStateOptimizer : PageStatePersister, IViewStateOptimizer protected BaseViewStateOptimizer(Page page) : base(page) /// /// Loads the ViewState contents inlớn a string. /// /// Returns the ViewState contents public abstract string LoadViewStateContents(); /// /// Saves the ViewState contents. /// /// ViewState contents /// Returns true if saving OK, otherwise will be false public abstract bool SaveViewStateContents(string viewStateContents); /// /// Loads the ViewState contents inkhổng lồ ViewState and ControlState. /// public override void Load() IStateFormatter formatter = this.StateFormatter; var viewStateContents = LoadViewStateContents(); var statePair = (Pair)formatter.Deserialize(viewStateContents); if (Page.Session != null) if (statePair != null) this.ViewState = statePair.First; this.ControlState = statePair.Second; else throw new InvalidOperationException("The Session is required for ViewStateOptimizer."); /// /// Saves the ViewState contents. /// public override void Save() ControlState != null) if (Page.Session != null) // --- Serialize the ViewState contents inkhổng lồ a string var formatter = this.StateFormatter; var statePair = new Pair(ViewState, ControlState); var serializedState = formatter.Serialize(statePair); // --- End // Saves khổng lồ the ViewSate contents with the specified string if (!SaveViewStateContents(serializedState)) throw new InvalidOperationException("Can"t save sầu the ViewState contents to the specified location. Please ensure all configurations are correct."); else throw new InvalidOperationException("The Session is required for ViewStateOptimizer.");

namespace ViewStateOptimizer.FileStorage using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.Web.UI; /// /// This class implements storing the ViewState contents in the files. /// public class FileViewStateOptimizer : BaseViewStateOptimizer public FileViewStateOptimizer(Page page) : base(page) /// /// Load the ViewState contents into string using the Session for storing the tệp tin path. /// /// Returns the ViewState contents public override string LoadViewStateContents() /// /// Save the ViewState contents to the specified file path which stored in the Session. /// /// ViewState contents /// Returns true if saving OK, otherwise will be false public override bool SaveViewStateContents(string viewStateContents) try catch return false;

namespace ViewStateOptimizer.FileStorage using System; using System.IO; using System.Web; /// /// This abstract class implements removing the *.vso files that store the ViewState contents. /// Be able to lớn inherit this class to implement your custom own. /// public abstract class BaseFileViewStateOptimizerHttpApplication : HttpApplication /// /// This sự kiện will be fired & then will remove the *.vso files that store the ViewState contents /// when the session timeout has expired. /// /// object that raised this event /// sự kiện data protected virtual void Session_End(object sender, EventArgs e) // --- Remove the *.vso files that store the ViewState contents. foreach (string key in Session.Keys) if(key.StartsWith(FileViewStateOptimizerOptions.ViewStatePrefixValue)) var salt = Session.ToString(); var vsFile = Session.ToString(); if(File.Exists(vsFile)) File.Delete(vsFile); // --- End

namespace ViewStateOptimizer using System; using System.Security.Cryptography; using System.Text; /// /// This static class contains the useful helpers khổng lồ secure the configurations for ViewState /// public static class ViewStateOptimizerSecurity /// /// Standardize from byte array lớn the UTF-8 string. /// /// byte array /// Returns the UTF-8 string public static string StandardizeToUtf8String(byte<> bytes) return Encoding.UTF8.GetString(bytes); /// /// Standardize from string to byte array. /// /// string /// Returns the byte array public static byte<> StandardizeToUtf8Bytes(string value) return Encoding.UTF8.GetBytes(value); /// /// Generates the salternative text byte array with the specified salternative text form size. /// /// salt size /// Return the salt byte array public static byte<> GenerateSalt(int saltSize) HashAlgorithm algorithm = new SHA512Managed(); byte<> random = new Byte; RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); rng.GetBytes(random); return algorithm.ComputeHash(random); /// /// Generates the salternative text string with the specified salt kích thước. /// /// salt size /// Return the salt string public static string GenerateSaltString(int saltSize) return StandardizeToUtf8String(GenerateSalt(saltSize)); /// /// Generates the hash byte array with the specified value. /// /// string /// Returns the hash byte array public static byte<> GenerateHash(string value) HashAlgorithm algorithm = new SHA512Managed(); return algorithm.ComputeHash(Encoding.Default.GetBytes(value)); /// /// Generates the hashed byte array with the specified value & salternative text string. /// /// hash string /// salt string /// Returns the hashed byte array public static byte<> GenerateHashBySalt(string value, string salt) var hmacSHA512 = new HMACSHA512(StandardizeToUtf8Bytes(salt)); return hmacSHA512.ComputeHash(StandardizeToUtf8Bytes(value)); /// /// Generates the hashed string with the specified value & salternative text string. /// /// hash string /// salternative text string /// Returns the hashed string public static string GenerateHashStringBySalt(string value, string salt) return StandardizeToUtf8String(GenerateHashBySalt(value, salt));

namespace ViewStateOptimizer.FileStorage using System.Web.UI; using System.Web.UI.Adapters; /// /// This class implements customizing the default PageStatePersister to FileViewStateOptimizer. /// public class FileViewStateOptimizerPageAdapter : PageAdapter /// /// Gets the file state persister. /// /// Returns the PageStatePersister type as FileViewStateOptimizer public override PageStatePersister GetStatePersister() return (new FileViewStateOptimizer(this.Page));
Tlỗi viện này mình viết trên nền .NET Framework 2.0 với rất có thể xử lý các bất lợi bên trên. Vì cầm cố vận dụng asp.net website forms của doanh nghiệp phải >= .Net Framework 2.0.

Kết luận

Mình mong muốn qua chủ đề này ViewState đang không hề là cơn ác mộng đối với các lập trình sẵn viên asp.net website forms. Chúng ta có thể tàng trữ và tải dữ liệu ViewState trên server với rất nhiều chiến thuật không giống nhau. Các chúng ta có thể sở hữu source code thư viện ở bên dưới đây

Download source code tlỗi viện ViewStateOptimizer bên trên Github Download source code thỏng viện ViewStateOptimizer trên Codeplex