Hypertext Transfer Protocol (HTTP) เป็นโปรโตคอลไร้สัญชาติ เมื่อไคลเอนต์ตัดการเชื่อมต่อจากเซิร์ฟเวอร์ โปรแกรม ASP.NET ละทิ้งวัตถุหน้า ด้วยวิธีนี้ แต่ละเว็บแอปพลิเคชันสามารถปรับขนาดเพื่อรองรับคำขอจำนวนมากพร้อมกันได้โดยไม่ต้องใช้หน่วยความจำเซิร์ฟเวอร์จนหมด
อย่างไรก็ตาม จำเป็นต้องใช้เทคนิคบางอย่างในการจัดเก็บข้อมูลระหว่างคำขอและเรียกค้นข้อมูลเมื่อจำเป็น ข้อมูลนี้เรียกว่าสถานะซึ่งเป็นค่าปัจจุบันของการควบคุมและตัวแปรทั้งหมดที่ผู้ใช้ปัจจุบันใช้ในเซสชันปัจจุบัน
ASP.NET จัดการสี่สถานะ:
ดูสถานะ
สถานะการควบคุม
สถานะเซสชัน
สถานะการสมัคร
View state คือสถานะของเพจและส่วนควบคุมทั้งหมด ยังคงไม่เปลี่ยนแปลงผ่านคำติชมของกรอบงาน ASP.NET
เมื่อเพจถูกส่งกลับไปยังไคลเอนต์ คุณสมบัติและการควบคุมของการเปลี่ยนแปลงเพจเหล่านี้จะถูกกำหนดและจัดเก็บไว้ในค่าของฟิลด์อินพุตที่ซ่อนอยู่ชื่อ _VIEWSTATE เมื่อเพจถูกโพสต์กลับมาอีกครั้ง ฟิลด์ _VIEWSTATE จะถูกส่งไปยังเซิร์ฟเวอร์พร้อมกับคำขอ HTTP
ดูสถานะสามารถเปิดหรือปิดใช้งานสำหรับ:
แอปพลิเคชันทั้งหมด : ตั้งค่าคุณสมบัติ EnableViewState ของส่วนในไฟล์ web.config
เพจ : ตั้งค่าคุณสมบัติ EnableViewState ของคำสั่งเพจเป็น <%@ Page Language="C#" EnableViewState="false" %>
การควบคุม : ตั้งค่าคุณสมบัติ control.EnableViewState
ทำได้โดยใช้วัตถุสถานะมุมมอง ซึ่งถูกกำหนดโดยคลาส StateBag ที่กำหนดโดยชุดของรายการสถานะมุมมอง StateBag เป็นโครงสร้างข้อมูลที่ประกอบด้วยคู่ค่าคุณสมบัติและจัดเก็บเป็นสตริงที่เกี่ยวข้องกับวัตถุ
คลาส StateBag มีคุณสมบัติดังต่อไปนี้:
คุณสมบัติ | อธิบาย |
---|---|
รายการ(ชื่อ) | ค่าของสถานะมุมมองที่มีชื่อที่ระบุ ซึ่งเป็นคุณสมบัติเริ่มต้นของ StateBag |
นับ | ชื่อของรายการในการเก็บรวบรวมสถานะ |
กุญแจ | ชุดกุญแจสำหรับสินค้าทั้งหมดในคอลเลกชัน |
ค่านิยม | การรวบรวมคุณค่าของสินค้าทั้งหมดในคอลเลกชัน |
คลาส StateBag มีวิธีการดังต่อไปนี้:
วิธี | อธิบาย |
---|---|
เพิ่ม(ชื่อ, ค่า) | เพิ่มรายการลงในคอลเลกชัน viewstate โดยอัปเดตรายการที่มีอยู่ |
ชัดเจน | ลบรายการทั้งหมดออกจากคอลเลกชัน |
เท่ากับ(วัตถุ) | กำหนดว่าวัตถุที่ระบุเท่ากับวัตถุปัจจุบันหรือไม่ |
จบ | อนุญาตให้เผยแพร่ทรัพยากรและดำเนินการล้างข้อมูลอื่นๆ |
รับตัวแจงนับ | ส่งกลับตัวนับของคู่คีย์/ค่าสำหรับวัตถุ StateItem ที่ซ้ำกันซึ่งจัดเก็บไว้ในวัตถุ StateBag |
รับประเภท | รับประเภทของอินสแตนซ์ปัจจุบัน |
เป็นItemDirty | ตรวจสอบวัตถุที่เก็บไว้ใน StateBag เพื่อยืนยันว่าได้รับการแก้ไขหรือไม่ |
ลบ(ชื่อ) | ลบรายการที่กำหนดเอง |
ชุดสกปรก | ตั้งค่าสถานะของวัตถุ StateBag และคุณสมบัติ Dirty ของวัตถุ StateItem แต่ละอันที่มีอยู่ |
SetItemDirty | ตั้งค่าคุณสมบัติ Dirty สำหรับวัตถุ StateItem ที่ระบุในวัตถุ StateBag |
ToString | ส่งกลับสตริงที่แสดงถึงวัตถุแพ็คเกจสถานะ |
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิดของสตริงที่จัดเก็บสถานะมุมมอง
มาเก็บตัวนับที่สามารถเพิ่มได้ทุกครั้งที่เพจถูกเรียกกลับโดยคลิกปุ่มบนเพจ ตัวควบคุมป้ายกำกับจะแสดงค่าของตัวนับ
รหัสไฟล์แท็กมีลักษณะดังนี้:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body></html>
ไฟล์โค้ดที่อยู่เบื้องหลังสำหรับอินสแตนซ์นี้มีลักษณะดังนี้:
public partial class _Default : System.Web.UI.Page{ public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; }}
มันจะให้ผลลัพธ์ดังต่อไปนี้:
สถานะการควบคุมไม่สามารถแก้ไข เข้าถึง หรือปิดใช้งานได้โดยตรง
เมื่อผู้ใช้เชื่อมต่อกับเว็บไซต์ ASP.NET วัตถุเซสชันใหม่จะถูกสร้างขึ้น เมื่อเปิดใช้งานสถานะเซสชัน สถานะเซสชันใหม่จะถูกสร้างขึ้นสำหรับคำขอใหม่แต่ละรายการ ออบเจ็กต์สถานะเซสชันนี้จะกลายเป็นส่วนหนึ่งของสภาพแวดล้อมรันไทม์และพร้อมใช้งานผ่านเพจ
โดยทั่วไปสถานะเซสชันจะใช้เพื่อจัดเก็บข้อมูลแอปพลิเคชัน เช่น สินค้าคงคลัง รายชื่อซัพพลายเออร์ บันทึกลูกค้า หรือตะกร้าสินค้า สามารถจัดเก็บข้อมูลของผู้ใช้และข้อมูลการตั้งค่าของพวกเขา และบันทึกเส้นทางที่ยังไม่ได้ตัดสินใจของผู้ใช้
เซสชันจะถูกระบุและติดตามโดย SessionID 120 บิต ส่งผ่านจากไคลเอนต์ไปยังเซิร์ฟเวอร์ และส่งคืนเป็นคุกกี้หรือ URL ที่แก้ไข SessionID ไม่ซ้ำกันทั่วโลกและเป็นแบบสุ่ม
ออบเจ็กต์สถานะเซสชันถูกสร้างขึ้นโดยคลาส HttpSessionState ซึ่งกำหนดคอลเลกชันของรายการสถานะเซสชัน
คลาส HttpSessionState มีคุณสมบัติดังต่อไปนี้:
คุณสมบัติ | อธิบาย |
---|---|
รหัสเซสชัน | ตัวระบุเซสชันที่ไม่ซ้ำ |
รายการ(ชื่อ) | ค่าของรายการสถานะเซสชันที่มีชื่อที่ระบุ ซึ่งเป็นคุณสมบัติเริ่มต้นของคลาส HttpSessionState |
นับ | จำนวนรายการในการรวบรวมสถานะเซสชัน |
หมดเวลา | รับและกำหนดระยะเวลาเป็นนาทีที่อนุญาตระหว่างคำขอก่อนที่ผู้ให้บริการจะหยุดสถานะเซสชัน |
คลาส HttpSessionState มีวิธีการดังต่อไปนี้:
วิธี | อธิบาย |
---|---|
เพิ่ม(ชื่อ, ค่า) | เพิ่มรายการใหม่ให้กับคอลเลกชันสถานะเซสชัน |
ชัดเจน | ลบไอเท็มทั้งหมดออกจากคอลเลกชันสถานะเซสชัน |
ลบ(ชื่อ) | ลบรายการที่ระบุออกจากคอลเลกชันสถานะเซสชัน |
ลบทั้งหมด | ลบคีย์และค่าทั้งหมดออกจากการรวบรวมสถานะเซสชัน |
ลบที่ | ลบรายการที่ดัชนีที่ระบุออกจากการรวบรวมสถานะเซสชัน |
วัตถุสถานะเซสชันคือคู่ชื่อ-ค่าที่สามารถจัดเก็บและดึงข้อมูลจากวัตถุสถานะเซสชัน ในทำนองเดียวกัน คุณสามารถใช้รหัสต่อไปนี้:
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
โค้ดด้านบนจะเก็บเฉพาะสตริงในออบเจ็กต์พจนานุกรมเซสชันเท่านั้น อย่างไรก็ตาม โค้ดดังกล่าวสามารถจัดเก็บประเภทข้อมูลและอาร์เรย์ดั้งเดิมทั้งหมดที่ประกอบด้วยประเภทข้อมูลดั้งเดิม, ชุดข้อมูล, DataTable, HashTable และออบเจ็กต์รูปภาพ รวมถึงออบเจ็กต์ที่ผู้ใช้กำหนดที่สืบทอดมาจาก วัตถุที่สามารถซีเรียลไลซ์ได้
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิดของการจัดเก็บสถานะเซสชัน มีสองปุ่มบนเพจ: ปุ่มกล่องข้อความสำหรับป้อนสตริงและปุ่มป้ายกำกับเพื่อแสดงข้อความที่จัดเก็บจากเซสชันล่าสุด รหัสไฟล์แท็กมีลักษณะดังนี้:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </td> </tr> </table> </div> </form> </body></html>
ควรมีลักษณะเช่นนี้ในมุมมองการออกแบบ:
รหัสพื้นหลังเป็นดังนี้:
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; }}
รันไฟล์และดูว่ามันทำงานอย่างไร:
แอปพลิเคชัน ASP.NET คือชุดของเว็บเพจ รหัส และไฟล์อื่นๆ ทั้งหมดในไดเร็กทอรีเสมือนเดียวบนเว็บเซิร์ฟเวอร์ เมื่อข้อมูลถูกเก็บไว้ในสถานะแอปพลิเคชัน ผู้ใช้ทุกคนจะสามารถใช้งานได้
เพื่อให้มีการใช้สถานะของแอปพลิเคชัน ASP.NET จะสร้างวัตถุสถานะแอปพลิเคชันสำหรับแต่ละแอปพลิเคชันจากคลาส HttpApplicationState และเก็บวัตถุไว้ในหน่วยความจำเซิร์ฟเวอร์ อ็อบเจ็กต์นี้แสดงโดยไฟล์คลาส global.asax
สถานะแอปพลิเคชันส่วนใหญ่จะใช้เพื่อจัดเก็บเคาน์เตอร์ สถิติอื่นๆ และข้อมูลแอปพลิเคชันทั้งหมด เช่น อัตราภาษีและอัตราคิดลด และเพื่อจัดเก็บเส้นทางของผู้ใช้ไปยังเว็บไซต์
คลาส HttpApplicationState มีคุณสมบัติดังต่อไปนี้:
คุณสมบัติ | อธิบาย |
---|---|
รายการ(ชื่อ) | ค่าของรายการแอปพลิเคชันที่มีชื่อที่ระบุ ซึ่งเป็นคุณสมบัติเริ่มต้นของ HttpApplicationState |
นับ | จำนวนรายการในการรวบรวมสถานะแอปพลิเคชัน |
คลาส HttpApplicationState มีวิธีการดังต่อไปนี้:
วิธี | อธิบาย |
---|---|
เพิ่ม(ชื่อ, ค่า) | เพิ่มรายการใหม่ให้กับคอลเลกชันสถานะแอปพลิเคชัน |
ชัดเจน | ลบรายการทั้งหมดออกจากคอลเลกชันสถานะแอปพลิเคชัน |
ลบ(ชื่อ) | ลบรายการที่ระบุออกจากคอลเลกชันสถานะแอปพลิเคชัน |
ลบทั้งหมด | เอาวัตถุทั้งหมดในคอลเลกชัน HttpApplicationState |
ลบที่ | เอาวัตถุ HttpApplicationState ออกจากคอลเลกชันที่พบโดยดัชนี |
ล็อค() | ล็อกคอลเลกชันสถานะแอปพลิเคชันเพื่อให้เฉพาะผู้ใช้ปัจจุบันเท่านั้นที่สามารถเข้าถึงได้ |
ปลดล็อค() | ปลดล็อกคอลเลกชันสถานะแอปพลิเคชันเพื่อให้ผู้ใช้ทุกคนสามารถเข้าถึงได้ |
โดยทั่วไปข้อมูลสถานะแอปพลิเคชันจะได้รับการดูแลโดยตัวจัดการที่เขียนขึ้นสำหรับเหตุการณ์:
แอปพลิเคชันเปิดขึ้น
การสมัครสิ้นสุดลง
ข้อผิดพลาดของแอปพลิเคชัน
เซสชั่นเริ่มต้น
เซสชั่นสิ้นสุดลง
ข้อมูลโค้ดต่อไปนี้แสดงไวยากรณ์พื้นฐานสำหรับการจัดเก็บข้อมูลสถานะแอปพลิเคชัน:
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}