إذا كنت معتادًا على عرض كود مصدر HTML للصفحة الحالية التي تتصفحها في IE، فقد ترى غالبًا مقتطفات من التعليمات البرمجية مشابهة لما يلي:
<نوع الإدخال = "مخفي" الاسم = "__VIEWSTATE" القيمة = "dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
لو أنت ذكي أكيد هتسأل إيه ده؟ ماذا يفعل؟ كيف ترتبط بهذه المقالة؟ عزيزي القراء، يرجى الاستماع لي ببطء.
في الواقع، هذا هو الأداء المميز لتطبيق MS لتقنية ViewState في Asp.net. لكي تظل الصفحة قادرة على قراءة بيانات الحالة الأصلية لعنصر تحكم الخادم بعد PostBack، يستخدم Asp.net تقنية ViewState، والتي تستخدم بشكل أساسي حقل نموذج من النوع المخفي بالاسم الافتراضي "__VIEWSTATE" لحفظ البيانات ونقلها
حفظها
قبل الإخراج بواسطة طريقة Page.SavePageStateToPersistenceMedium وتحميلها بواسطة Page.LoadPageStateFromPersistenceMedium) على الرغم من أنه يمكننا بسهولة تعطيل رحلة الذهاب والإياب لهذه البيانات من خلال ثلاثة مستويات
على مستوى التطبيق، قم بتعيين
على مستوى الصفحة الواحدة، قم بتعيين < %@Page EnableViewStateMac='false' %> في الصفحة أو قم بتعيين Page.EnableViewStateMac = false من خلال الكود؛
ومع ذلك، إذا تمكنا من حل عبء نقل البيانات بشكل كامل عن طريق تعطيل ViewState دون التسبب في آثار جانبية، فلن يكون مهندسو MS أغبياء لدرجة أنهم لطيفون جدًا (ما الفائدة من تركها كشيء يمكن الاستغناء عنه؟) لا يمكن حل مشكلة عبء النقل هذه ببساطة عن طريق تعطيلها، ولا يمكننا سوى العثور على مسار آخر لجعل حجم الإرسال في رحلة ذهابًا وإيابًا للشبكة صغيرًا قدر الإمكان، لذلك أصبح الضغط خيارنا الأول. طالما قمنا بتحميل طريقة SavePageStateToPersistenceMedium () وطريقة LoadPageStateFromPersistenceMedium () لفئة الصفحة، وضغط البيانات وفك ضغطها في الطريقة المحملة بشكل زائد. أصبحت الفئتان GZipInputStream وGZipOutputStream المقدمتين من خلال المشروع مفتوح المصدر SharpZipLib في نظرنا، من أجل الراحة، يمكننا أيضًا كتابة فئة CompressionHelper بالكود التالي:
1using System.IO؛
2باستخدام ICSharpCode.SharpZipLib.GZip؛
3
4namespace Ycweb.Components
5 {
6 /**//// <الملخص>
7 /// وصف ملخص لـ CompressionHelper.
8 /// الملخص>
9 فئة عامة CompressionHelper
10 {
11 publicCompressionHelper()
12 {
13 //
14 // TODO: أضف منطق المنشئ هنا
15 //
16}
17
18 /**//// <الملخص>
19 /// ضغط البيانات
20 ///
21 /// مصفوفة البايت المراد ضغطها
22 ///
23 بايت ثابت عام[] CompressByte(بايت[] بيانات)
أربعة وعشرون {
25 MemoryStream ms = new MemoryStream();
26 Stream s=new GZipOutputStream(ms);
27 s.Write(data, 0, data.Length);
28 ثانية.إغلاق();
29 return ms.ToArray();
30}
31
32 /**//// <الملخص>
33 /// فك ضغط البيانات
34 ///
35 /// مصفوفة البايت المراد فك ضغطها
36 ///
37 بايت ثابت عام[] DeCompressByte(بايت[] بيانات)
38 {
39 بايت[] writeData = بايت جديد[2048];
40 MemoryStream ms= new MemoryStream( data );
41 Stream sm = new GZipInputStream(ms) as Stream;
42 MemoryStream outStream = new MemoryStream();
43 بينما (صحيح)
44 {
45 int size = sm.Read(writeData,0, writeData.Length );
46 إذا (الحجم >0)
47 {
48 outStream.Write(writeData,0,size);
49 }
50 آخر
51 {
52 استراحة؛
53}
54 }
55 سم.إغلاق();
56 بايت[] outArr = outStream.ToArray();
57 outStream.Close();
58 العودة إلى الخارج؛
59 }
60 }
61} ثم نقوم بتحميل الأساليب LoadPageStateFromPersistenceMedium() و SavePageStateToPersistenceMedium(Object viewState) في الفئة الأساسية للتحكم في الصفحة المشتقة من الفئة Page.
1 تحميل وحفظ بيانات حالة العرض# المنطقة تحميل وحفظ بيانات حالة العرض
2 كائن التجاوز المحمي LoadPageStateFromPersistenceMedium()
3 {
4//اقرأ البيانات من المجال المخفي __SmartViewState المسجل بنفسك
5 سلسلة viewState = Request.Form["__SmartViewState"];
6 بايت[] بايت = Convert.FromBase64String(viewState);
7 //استدعاء الطريقة الثابتة CompressionHelper.DeCompressByte() المتوفرة أعلاه لفك ضغط البيانات
8 بايت = CompressionHelper.DeCompressByte(bytes);
9 LosFormatter formatter = new LosFormatter();
10 return formatter.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 تجاوز محمي باطل SavePageStateToPersistenceMedium(Object viewState)
15 {
16 LosFormatter formatter = new LosFormatter();
17 كاتب StringWriter = new StringWriter();
18 formatter.Serialize(writer, viewState);
19 سلسلة viewStateString =writer.ToString();
20 بايت[] بايت = Convert.FromBase64String(viewStateString);
21 //استدعاء الطريقة الثابتة CompressionHelper.CompressByte() المذكورة أعلاه لضغط البيانات
22 بايت = CompressionHelper.CompressByte(bytes);
ثلاثة وعشرين
24 // قم بتسجيل حقل مخفي جديد __SmartViewState، يمكنك أيضًا تحديده بنفسك
25 this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#المنطقة
بعد المعالجة المذكورة أعلاه، يكون كود المصدر في صفحة إخراج الويب كما يلي:
<نوع الإدخال = "مخفي" الاسم = "__SmartViewState" القيمة = "H4sIAPtPoNwA/81ce1PbWJb/ ……
<نوع الإدخال = "مخفي" الاسم = "__VIEWSTATE" القيمة = "" />
يحتوي الحقل المخفي الأصلي "__VIEWSTATE" على قيمة فارغة، ويتم استبداله بحقل مخفي جديد "__SmartViewState" تم تسجيله بأنفسنا لتخزين السلسلة المضغوطة. وبهذه الطريقة، يكون تأثير التسريع واضحًا مع مشروعنا على سبيل المثال، تبلغ قيمة سلسلة ViewState الأصلية للصفحة الرئيسية لـ DG3G.COM حوالي 28 كيلو بايت، وهي 7 كيلو بايت بعد الضغط، في حين أن قيمة سلسلة ViewState الأصلية للصفحة الرئيسية لـ Acafa.com تبلغ حوالي 43 كيلو بايت، وهي 8 كيلو بايت بعد الضغط. هذا النوع من المعالجة مرضي تمامًا. بالطبع، إذا شعرت أنها ليست شاملة بما فيه الكفاية، فيمكنك أيضًا تخزين سلسلة ViewState في الجلسة، ومع ذلك، إذا قمت بذلك، فسيزداد الضغط على ذاكرة الخادم بشكل حاد (خاصة عندما يكون عدد الزيارات كبيرًا). يوصى بعدم استخدامه بخفة. إذا كان خادم الويب الخاص بك يحتوي على ذاكرة 10 جيجا أو 8 جيجا، فمن الأفضل أن تجربه. الكود المعدل ذو الصلة موضح أدناه:
قم بتغيير الكود الموجود في نص طريقة LoadPageStateFromPersistenceMedium() أعلاه:
string viewState = Request.Form["__SmartViewState"];
تعديل إلى:
string viewState = Session["__SmartViewState"].ToString();
وفي الوقت نفسه، أضف الكود الموجود في نص SavePageStateToPersistenceMedium() أعلاه:
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
تعديل إلى:
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
أخيرًا، الأكواد والحلول المذكورة أعلاه كلها من ممارسات تطوير VS2003، ولا أقدم أي وعود بشأن ما إذا كان VS2005 مناسبًا أم لا الحلول، وسوف أكون سعيدا للغاية.