Viewstate là gì

*

*

ViewState đã không còn là cơn ác mộng so với các asp.net web forms developer


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

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

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

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

Tăng chi phí đường dẫn. => Tốn nhiều ngân sách mang lại đường dẫn. Rủi ro về bảo mật dữ liệu ViewState. => Bởi vì khoác định tài liệu ViewState mã hóa theo chuẩn chỉnh Base64. Theo chuẩn chỉnh này rất có thể giải thuật một giải pháp dễ ợt. Trang web lờ đờ hơn. => Bởi bởi tài liệu ViewState nặng rất có thể làm trình coi xét cài đặt trang web chậm chạp rộng.

Ở trên đây họ chỉ rất có thể hạn chế điểm vô ích về bảo mật tài liệu ViewState, chúng ta cũng 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 dù thế chúng ta cũng không chắc về đoạn tài liệu ViewState được lưu sống phía client dành được bảo mật trọn vẹn hay là không.

Để vật chứng đến vấn đề đó bản thân rước một ví dụ nho nhỏ dại. Giả sử bản thân gồm một trang Default.aspx. Trong trang này một VPS control GridView. Control này sẽ binding cho list tài liệu Persons.

Xem thêm: Download Và Cài Đặt Game Mario Lớp 6 Win 7 8 8, Cách Cài Game Mario Trên Windows 7

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 tiếng các bạn demo chạy xe trên trình để mắt bạn sẽ thấy đoạn mã ViewState sinh hoạt phía client như hình bên dưới đây:

*

Với đoạn mã này chúng ta có thể giải mã chúng bởi việc viết code hay được dùng công dụ ViewState decoder online. Tại đây bản thân áp dụng mức sử dụng ViewState decoder online ở trang http://ignatu.co.uk/ViewStateDecoder.aspx nhằm giải thuật lại đoạn ViewState của chúng ta:

*

Nhỏng chúng ta thấy trong hình bên trên đoạn dữ liệu ViewState của họ đã được giải mã điều này vẫn tiềm tàng khủng hoảng rủi ro về bảo mật thông tin giả dụ tài liệu nhạy bén hay đặc trưng phía trong ViewState chưa được mã hóa trọn vẹn. Để đoạn dữ liệu ViewState của họ bảo mật rộng bạn cũng có thể sử dụng directive EnableViewStateMac của asp.net web forms cùng thiết lập cấu hình vào web.config.

Default.aspx


"C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ViewStateWebApplication.Default" EnableViewStateMac="true" %>
quý khách hàng demo điều khiển xe trên trình chú ý lần tiếp nữa bạn thấy dữ liệu ViewState đã có mã hóa và bạn không có thể giải mã theo Base64 nhỏng trườc

*

Nhỏng hình phía trên họ vẫn bảo mật thông tin được tài liệu ViewState. Tuy nhiên điều này cũng không vững chắc tài liệu của họ bảo mật một cách hoàn toàn. Theo kinh nghiệm của bản thân mình, chúng ta nên tránh giữ bất kể tài liệu nhạy bén trong ViewState. Điều này góp họ giảm bớt khủng hoảng khá nhiều trong ứng dụng website.

Mặc mặc dù tài liệu ViewState được bảo mật thông tin họ vẫn còn đó gặp 2 điểm bất lợi khác như đã nhắc làm việc bên trên. Để hạn chế hoàn toàn, chúng ta có thể lưu trữ và cài đặt tài liệu ViewState trực tiếp trên VPS nắm bởi phía client. Lúc Này gồm vài chiến thuật thực tế dưới đây để tiến hành điều này:

Lưu trữ với thiết lập tài liệu ViewState vào Session bên trên hệ thống. Giải pháp này chỉ giành cho dữ liệu ViewState vừa và nhỏ tuổi. Lưu trữ với cài dữ liệu ViewState vào tập tin ở server. Lưu trữ và thiết lập tài liệu ViewState vào asp.net cache trên server. Lưu trữ với cài tài liệu ViewState trong distributed caching trên VPS nhỏng memcached, redis...

Do mình không có tương đối nhiều thời hạn, chính vì như vậy trong thời điểm 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à xử lý bài toán lưu trữ cùng sở hữu tài liệu ViewState trong tập tin lên trên VPS mang đến chúng ta. Mình sẽ upgrade từ từ và cung ứng toàn bộ những phương án tốt nhất hiện có. Sau đây là sơ đồ vật xây dựng của mình:

*

Inteface IViewStateOptimizer: interface này khái niệm 2 cách làm Load với Save tài liệu ViewState. Abstract class BaseViewStateOptimizer: lớp abstract này tiến hành interface IViewStateOptimizer để thực hiện tính trừu tượng chung mang lại vấn đề Load cùng Save dữ liệu ViewState. Trong lớp này có 2 phương thức abstract phải thực hiện lúc thừa kế đó là LoadViewStateContents với SaveViewStateContents. Đối cùng với LoadViewStateContents, hàm này sẽ mua nội dụng ViewState vào trang với các hệ thống controls. Còn đối với SaveViewStateContents, hàm này vẫn giữ dữ liệu ViewState mang đến chỗ nào đó. quý khách hàng hoàn toàn có thể kế thừa trường đoản cú lớp này cùng thực hiện 2 cách làm này nhằm mở rộng tlỗi viện này. Class FileViewStateOptimizer: lớp này thừa kế từ lớp trừu tượng BaseViewStateOptimizer nhằm tiến hành câu hỏi lưu trữ cùng mua dữ liệu ViewState trong tập tin trên VPS. Abstract Class BaseFileViewStateOptimizerHttpApplication: lớp trừu tượng này thực hiện việc xóa các tập tin đã lưu lúc session đã mất hạn cùng hoàn thành. Bạn phải kế thừa lớp này trong tập tin Global. Class ViewStateOptimizerSecurity: lớp static này tiềm ẩn những cách thức 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 đến câu hỏi lưu trữ với mua tài liệu ViewState bên trên server. Class FileViewStateOptimizerPageAdapter: lớp này thông số kỹ thuật tổng thể mang đến việc biến đổi cách làm lưu trữ cùng cài đặt tài liệu ViewState mang đến tập tin vào server. Class SessionViewStateOptimizerPageAdapter: lớp này cấu hình toàn cục cho Việc chuyển đổi cách làm lưu trữ với mua tài liệu ViewState mang đến Session trên server.

Xem thêm: Chi Nhánh Hạch Toán Phụ Thuộc Khác Tỉnh, Cách Hạch Toán Chi Nhánh Phụ Thuộc Cùng Tỉnh

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 into 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 inlớn 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 inlớn a string var formatter = this.StateFormatter; var statePair = new Pair(ViewState, ControlState); var serializedState = formatter.Serialize(statePair); // --- End // Saves lớn the ViewSate contents with the specified string if (!SaveViewStateContents(serializedState)) throw new InvalidOperationException("Can"t save sầu the ViewState contents to lớn 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 file path. /// /// Returns the ViewState contents public override string LoadViewStateContents() /// /// Save sầu the ViewState contents to the specified tệp tin 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 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 sầu the *.vso files that store the ViewState contents /// when the session timeout has expired. /// /// object that raised this sự kiện /// sự kiện data protected virtual void Session_End(object sender, EventArgs e) // --- Remove sầu the *.vso files that store the ViewState contents. foreach (string key in Session.Keys) if(key.StartsWith(FileViewStateOptimizerOptions.ViewStatePrefixValue)) var salternative text = 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 lớn secure the configurations for ViewState /// public static class ViewStateOptimizerSecurity /// /// Standardize from byte array khổng lồ 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 lớn byte array. /// /// string /// Returns the byte array public static byte<> StandardizeToUtf8Bytes(string value) return Encoding.UTF8.GetBytes(value); /// /// Generates the salt byte array with the specified salt kích cỡ. /// /// salt size /// Return the salternative text 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 salt string with the specified salternative text size. /// /// salternative text kích cỡ /// Return the salternative text 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 và salt string. /// /// hash string /// salternative text 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 & salt string. /// /// hash string /// salt 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 mặc định PageStatePersister khổng lồ 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 bản thân viết trên nền .NET Framework 2.0 và rất có thể xử lý những vô ích bên trên. Vì rứa vận dụng asp.net web forms của doanh nghiệp yêu cầu >= .Net Framework 2.0.

Kết luận

Mình hy vọng qua chủ thể này ViewState sẽ không còn là cơn ác mộng đối với các xây dựng viên asp.net web forms. Chúng ta rất có thể lưu trữ với cài tài liệu ViewState bên trên hệ thống với nhiều phương án khác biệt. Các bạn cũng có thể sở hữu source code thư viện sinh hoạt dưới đây

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


Chuyên mục: Review công nghệ