من الضروري الحفاظ على معلومات الحالة لصفحات الويب وعناصر التحكم الخاصة بها. ومع ذلك، نظرًا لأن تطبيقات الويب مبنية على بروتوكول HTTP، وهو بروتوكول عديم الحالة، فإن الحفاظ على معلومات الحالة يصبح أمرًا صعبًا للغاية. من أجل حل هذه المشكلة، توفر تقنية ASP.NET 2.0 مجموعة متنوعة من الحلول، مثل استخدام الجلسة وملفات تعريف الارتباط وحالة العرض وحالة التحكم والحقول المخفية وسلاسل الاستعلام وتكوين المستخدم المخصص (ملف التعريف) وما إلى ذلك. لاستخدام تقنية ASP.NET 2.0 لإنشاء عناصر تحكم في الخادم، يعد الحفاظ على معلومات الحالة أمرًا مهمًا أيضًا. والحل الرئيسي هو استخدام حالة العرض وحالة التحكم. تشرح هذه المقالة المعرفة الأساسية لحالة العرض (ViewState) بالتفصيل، وتقدم طريقة تطبيق حالة العرض من خلال التطبيقات النموذجية.
عرض نظرة عامة على الحالة
يعد عرض الحالة تقنية مهمة جدًا تسمح للصفحة وعناصر التحكم الموجودة في الصفحة بالحفاظ على معلومات الحالة أثناء الرحلة ذهابًا وإيابًا من الخادم إلى العميل والعودة من العميل. بهذه الطريقة، يمكن إنشاء تأثير صفحة ذو حالة ويتم تنفيذه بشكل مستمر فوق بيئة عديمة الحالة مثل الويب. يقدم هذا القسم بشكل أساسي آلية التشغيل وطرق التطبيق وأنواع البيانات المخزنة والأداء والأمان وحظر حالة العرض (هذه ميزة جديدة في ASP.NET 2.0) ومزايا وعيوب حالة العرض.
(1)
عملية التشغيل المحددة لحالة عرض آلية التشغيل هي: عندما يطلب المستخدم صفحة .aspx، يقوم إطار عمل .NET أولاً بتسلسل بيانات الحالة الخاصة بعناصر التحكم ذات الصلة في سلسلة، ثم يجعلها ملفًا باسم __VIEWSTATE يتم إرسال قيمة الحقل المخفي إلى العميل. إذا تم طلب الصفحة لأول مرة، فسيتم أيضًا تنفيذ عنصر تحكم الخادم لأول مرة. يحتوي الحقل المخفي المسمى __VIEWSTATE فقط على المعلومات الافتراضية لعنصر التحكم، والتي تكون عادةً فارغة أو فارغة. في حدث إعادة النشر اللاحق، يتم حفظ حالة خاصية تحكم الخادم المتوفرة في إعادة النشر السابقة في ViewState. يسمح هذا للتحكم في الخادم بمراقبة الحالة قبل حدوث حدث إعادة النشر الذي تتم معالجته حاليًا. يتم الاهتمام بهذه العمليات بواسطة إطار عمل .NET، وبالنسبة للمستخدمين، فإن تنفيذ صفحة .aspx سيكون له تأثير التنفيذ المستمر.
(2) أنواع البيانات المخزنة
يمكن لحالة العرض تخزين أنواع متعددة من البيانات، ومن أجل تحسين كفاءة التشغيل، تتضمن حالة العرض نفسها أيضًا مجموعة من طرق التسلسل المحسنة للأنواع الشائعة. تتضمن أنواع البيانات التي تدعمها طريقة تسلسل حالة العرض بشكل افتراضي ما يلي: String وInt32 وUnit وColor وArray وArrayList وHashTable ومحول النوع المخصص TypeConverter.
تم تحسين حالة العرض لكائنات Array وArrayList وHashTable التي تحتوي على الأنواع المذكورة أعلاه. لذلك، عند استخدام حالة العرض في عناصر التحكم، يجب أن تحاول تقييد استخدامك لأنواع البيانات البسيطة المذكورة أعلاه، بالإضافة إلى الأنواع المحسنة. هنا، نحتاج إلى التركيز على محول النوع المخصص TypeConverter، والذي يوفر طريقة موحدة لتحويل نوع القيمة إلى أنواع أخرى والوصول إلى القيم القياسية والخصائص الفرعية. على سبيل المثال، يمكنك استخدام TypeConverter لتحويل سلسلة إلى قيمة رقمية، أو قيمة رقمية إلى سلسلة. إذا لم يكن هناك محول نوع، فسيستخدم إطار عمل الصفحة وظيفة التسلسل الثنائي التي يوفرها إطار عمل .NET لإجراء تسلسل للكائن. هذه العملية تستهلك الكثير من الموارد.
(3) الأداء والأمان
عند استخدام حالة العرض، يجب إجراء تسلسل للكائنات أولاً ثم إلغاء تسلسلها عبر إعادة النشر. لذلك، علينا أن نعرف شيئا عن أداء ViewState. بشكل افتراضي، سيتم تمكين ViewState لعنصر التحكم إذا لم تكن بحاجة إلى استخدام ViewState، فمن الأفضل إيقاف تشغيله. لن تكون هناك حاجة إلى ViewState في المواقف التالية: (1) لا يحدد عنصر التحكم الأحداث من جانب الخادم (أحداث التحكم في هذا الوقت هي جميع الأحداث من جانب العميل ولا تشارك في إعادة النشر) (2) عنصر التحكم موجود لا توجد قيم خاصية ديناميكية أو مرتبطة بالبيانات. طريقة إيقاف تشغيل حالة العرض هي تعيين قيمة EnableViewState لعنصر التحكم إلى "خطأ"، أي EnableViewState = "false".
افتراضيًا، عندما يتم تجميع المحتوى المتعلق بحالة العرض وإرساله إلى العميل، سيرى القارئ محتوى الحقل المخفي __VIEWSTATE في كود HTML الخاص بالصفحة. هذه بعض السلاسل التي لا معنى لها وهي نتيجة لترميز إطار عمل .NET للمحتوى ذي الصلة من خلال تشفير Base64. يتم إرسالها ذهابًا وإيابًا بين العميل والخادم بنص واضح. في بعض الحالات، كما هو الحال عندما يتعلق الأمر بمحتوى حساس مثل كلمات المرور والحسابات وسلاسل الاتصال وما إلى ذلك، يكون استخدام الطريقة الافتراضية غير آمن على الإطلاق. لتحقيق هذه الغاية، يوفر إطار عمل .NET آليتي أمان لـ ViewState:
آلية التحقق:
يمكنك توجيه إطار عمل .NET لإلحاق رمز التجزئة ببيانات ViewState عن طريق تعيين سمة EnableViewStateMAC = "true" (رمز التجزئة هو A SHA1 بطول 160 بت، لذلك سيؤثر بشكل خطير على أداء التنفيذ). عند حدوث حدث إعادة النشر، سيتم إعادة إنشاء رمز التجزئة ويجب أن يتطابق مع رمز التجزئة الأصلي. بهذه الطريقة، يمكن التحقق بشكل فعال مما إذا كان من الممكن التلاعب بحالة العرض أثناء عملية الإرسال. افتراضيًا، يستخدم .NET Framework خوارزمية SHA1 لإنشاء رموز تجزئة ViewState. بالإضافة إلى ذلك، يمكنك أيضًا تحديد خوارزمية MD5 عن طريق تعيين <machineKey> في ملف Machine.config، كما هو موضح أدناه: <machineKey validation="MD5" />. أداء خوارزمية MD5 أفضل من أداء خوارزمية SHA1، ولكنها أيضًا ليست آمنة بدرجة كافية.
· تستخدم آلية التشفير
التشفير لحماية قيم البيانات الفعلية في حقول ViewState. أولاً، يجب تعيين EnableViewStatMAC="true" كما هو موضح أعلاه. بعد ذلك، قم بتعيين نوع التحقق من صحة MachineKey على 3DES، أي <machineKey validationKey = "AutoGenerate" decryptionKey = "AutoGenerate" validation = "3DES" />، والذي يوجه ASP.NET لاستخدام خوارزمية التشفير 3DES لتشفير قيمة ViewState.
(4) عرض حظر الحالة
يقدم المحتوى أعلاه بعض المعرفة الأساسية لحالة العرض. ومع ذلك، قد يرتبك بعض القراء: ماذا لو أصبحت بيانات حالة العرض كبيرة جدًا في بعض الحالات؟ ومن الواضح أن هذا سيكون له بعض العواقب غير المقصودة. ولتحقيق هذه الغاية، يضيف ASP.NET 2.0 ميزة جديدة تسمى "حظر حالة العرض". إذا أصبحت كمية البيانات في حالة العرض كبيرة جدًا، فإن تقسيم حالة العرض يقسم البيانات تلقائيًا إلى أجزاء متعددة ويضع البيانات في حقول نماذج مخفية متعددة.
لتمكين تقسيم حالة العرض، قم بتعيين الخاصية MaxPageStateFieldLength إلى الحد الأقصى للحجم المسموح به في حقل حالة عرض واحد، بالبايت. عند إعادة نشر الصفحة مرة أخرى إلى الخادم، تقوم الصفحة بتحليل سلسلة حالة العرض أثناء مرحلة تهيئة الصفحة واستعادة معلومات الخاصية في الصفحة. الإعداد الافتراضي هو -1، مما يعني عدم وجود حد أقصى للحجم ولن يتم تقسيم حالة العرض إلى أجزاء.
(5) المزايا والعيوب
يتميز استخدام حالة العرض بالمزايا الثلاث التالية: 1. يستهلك موارد خادم أقل (مقارنة بالتطبيق والجلسة). لأنه تتم كتابة بيانات حالة العرض على جهاز الكمبيوتر العميل. 2. سهل الصيانة. افتراضيًا، يقوم نظام .NET تلقائيًا بتمكين صيانة بيانات حالة التحكم. 3. ميزات الأمان المحسنة. يتم تجزئة القيم الموجودة في حالة العرض وضغطها وترميزها وفقًا لتطبيق Unicode، وهو أكثر أمانًا من استخدام الحقول المخفية.
استخدام حالة العرض له العيوب الثلاثة التالية: 1. اعتبارات الأداء. نظرًا لأنه يتم تخزين حالة العرض في الصفحة نفسها، إذا تم تخزين قيمة كبيرة، فقد يظل المستخدم بطيئًا عند عرض الصفحة وإرسالها، حتى لو كانت حالة العرض مقسمة. 2. قيود المعدات. قد لا تحتوي الأجهزة المحمولة على سعة ذاكرة كافية لتخزين كميات كبيرة من بيانات حالة العرض. لذلك، عند نقل عناصر تحكم الخادم على الجهاز، يتم استخدام طريقة تنفيذ مختلفة. 3. المخاطر الأمنية المحتملة. يتم تخزين حالة العرض في واحد أو أكثر من الحقول المخفية في الصفحة. على الرغم من أن حالة العرض تقوم بتخزين البيانات بتنسيق مجزأ، إلا أنه من الممكن التلاعب بها. إذا قمت بعرض مصدر إخراج الصفحة مباشرةً، فيمكنك رؤية المعلومات في الحقول المخفية، مما يؤدي إلى مشكلات أمنية محتملة.
التطبيقات النموذجية
في عملية تطوير عناصر تحكم الخادم باستخدام تقنية ASP.NET 2.0، هناك العديد من الجوانب التي يمكن من خلالها استخدام حالة العرض. من الشائع استخدام قاموس ViewState لتنفيذ خصائص التحكم بالخادم. ViewState من النوع System.Web.UI.StateBag - قاموس لأزواج المفاتيح/القيمة التي يمكن تخزين قيم خصائص التحكم في الخادم فيها. يستخدم ما يلي مثالا نموذجيا لتوضيح طريقة تطبيق ViewState.
في عنصر تحكم الخادم المخصص LabelInViewState، يتم تطبيق خاصيتين Text وTextInViewState. يتم إنشاء الأول باستخدام متغيرات خاصة، ويتم تنفيذ الأخير باستخدام ViewState. يتم استخدامها جميعًا للحصول على محتوى نصي أو تعيينه. الكود المصدري لملف تنفيذ التحكم المخصص LabelInViewState.cs هو كما يلي.
باستخدام النظام;باستخدام System.Collections.Generic; باستخدام System.ComponentModel؛ باستخدام System.Text؛ باستخدام System.Web؛ باستخدام System.Web.UI؛ باستخدام System.Web.UI.WebControls;مساحة الاسم WebControlLibrary{ [الخاصية الافتراضية("النص")] [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")] الفئة العامة LabelInViewState: WebControl { سلسلة خاصة _text // تنفيذ سمة النص public string Text {; يحصل { العودة (_text == فارغة)؟ } تعيين {_نص = قيمة} } // استخدم ViewState لتنفيذ خاصية TextInViewState public string TextInViewState { يحصل { String s = (String)ViewState["TextInViewState"]; return ((s == null) ? String.Empty : s); } set { ViewState["TextInViewState"] = value } } // تجاوز طريقة RenderContents protected override void RenderContents(HtmlTextWriterput) { Output.Write("النص ="); Output.Write(Text); Output.Write("<br/>"); Output.Write("TextInViewState = "); Output.Write(TextInViewState); } } } |
<%@ لغة الصفحة = "C#" AutoEventWireup = "true" CodeFile = "Default.aspx.cs" يرث = "_Default" %> <%@ تسجيل مساحة الاسم = "WebControlLibrary" التجميع = "WebControlLibrary" TagPrefix = "عينة" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> < تشغيل البرنامج النصي = "الخادم"> باطلة Button1_Click(object sender, EventArgs e) { DemoLabel.Text = TextBox1.Text; DemoLabel.TextInViewState = TextBox2.Text; } </ نص > <html xmlns="http://www.w3.org/1999/xhtml"> <رئيس تشغيل = "الخادم"> <title>استخدم حالة العرض ViewState </title> </الرأس> <نمط الجسم = "حجم الخط: صغير؛"> <form id="form1" runat="server"> <div> الاسم: |
يتضمن الكود أعلاه المعروض على الصفحة مربعي نص وزرين وعنصر تحكم خادم مخصص LabelInViewState. كما هو موضح في معالج الأحداث Button1_Click، عند النقر فوق الزر "إرسال"، سيحصل عنصر التحكم LabelInViewState على النص الموجود في مربع النص ويعرضه. تظهر عروض التطبيق في الشكلين 1 و 2.
الشكل 1 انقر فوق زر الإرسال | الشكل 2 انقر فوق زر إعادة التحميل |