การจัดการเซสชันใน ASP.NET [ตัวอย่าง]
⚡ สรุปอย่างชาญฉลาด
การจัดการเซสชันใน ASP.NET ช่วยให้แอปพลิเคชัน HTTP ที่ไม่มีสถานะสามารถจดจำข้อมูลผู้ใช้ได้ระหว่างการร้องขอต่างๆ บทความนี้จะอธิบายเกี่ยวกับ ViewState, อ็อบเจ็กต์ Session สำหรับจัดเก็บคู่คีย์-ค่า, ตัวอย่างการใช้งาน, โหมดสถานะเซสชัน, การกำหนดค่าหมดเวลา และข้อดีของสถานะเซสชัน
การจัดการเซสชัน ASP.NET
โปรโตคอล HTTP ที่เว็บแอปพลิเคชันทั้งหมดทำงานนั้นเป็นโปรโตคอลไร้สัญชาติ การไร้สัญชาติหมายความว่าข้อมูลจะไม่ถูกเก็บรักษาไว้จากคำขอหนึ่งไปยังอีกคำขอหนึ่ง
ตัวอย่างเช่น หากคุณมีหน้าเข้าสู่ระบบที่มีช่องข้อความ 2 ช่อง ช่องหนึ่งสำหรับชื่อและอีกช่องสำหรับรหัสผ่าน เมื่อคุณคลิกปุ่มเข้าสู่ระบบบนหน้าดังกล่าว แอปพลิเคชันจะต้องตรวจสอบให้แน่ใจว่าชื่อผู้ใช้และรหัสผ่านถูกส่งต่อไปยังหน้าถัดไป
ใน ASP.Net นั้นมีวิธีการจัดการเรื่องนี้หลายวิธี วิธีแรกคือการใช้แนวคิดที่เรียกว่า ViewState ซึ่ง ASP.Net จะจัดเก็บเนื้อหาของคอนโทรลทั้งหมดไว้ในนั้นโดยอัตโนมัติ และยังช่วยให้มั่นใจได้ว่าข้อมูลนี้จะถูกส่งต่อไปยังหน้าถัดไป โดยทำผ่านคุณสมบัติที่เรียกว่า ViewState
ไม่เหมาะสำหรับนักพัฒนาที่จะเปลี่ยนแปลงสิ่งใดในสถานะมุมมอง เนื่องจากควรได้รับการจัดการโดย ASP.Net เท่านั้น
วัตถุเซสชัน ASP.NET
อีกวิธีหนึ่งคือการใช้วัตถุที่เรียกว่า "วัตถุเซสชัน" อ็อบเจ็กต์เซสชันพร้อมใช้งานตลอดวงจรการใช้งานของแอปพลิเคชัน คุณสามารถจัดเก็บคู่คีย์-ค่าจำนวนเท่าใดก็ได้ในออบเจ็กต์เซสชัน ดังนั้นในทุกหน้า คุณสามารถเก็บค่าไว้ในอ็อบเจ็กต์ Session ผ่านทางโค้ดบรรทัดด้านล่าง
Session["Key"] = value
วิธีการนี้จะเก็บค่าไว้ในอ็อบเจ็กต์ Session โดยส่วน 'key' จะใช้สำหรับตั้งชื่อให้กับค่า ทำให้สามารถเรียกใช้ค่าได้ในภายหลัง หากต้องการเรียกใช้ค่า คุณสามารถใช้คำสั่งด้านล่างนี้ได้เลย
Session["Key"]
ตัวอย่างอ็อบเจ็กต์เซสชัน ASP.NET
ในตัวอย่างนี้ เราจะใช้ object Session เพื่อเก็บชื่อที่ป้อนในช่องข้อความชื่อบนหน้าเว็บ จากนั้นเราจะดึงค่าดังกล่าวออกมาและแสดงผลบนหน้าเว็บตามต้องการ มาเพิ่มโค้ดด้านล่างลงในไฟล์ Demo.aspx.cs กันเลย
protected void btnSubmit_Click(object sender, EventArgs e) { Session["Name"] = txtName.Text; Response.Write(Session["Name"]); lblName.Visible = false; txtName.Visible = false; lstLocation.Visible = false; chkC.Visible = false; chkASP.Visible = false; rdMale.Visible = false; rdFemale.Visible = false; btnSubmit.Visible = false; }
Code คำอธิบาย:-
- บรรทัดแรกของโค้ดจะดึงค่าจากช่องข้อความ "Name" และเก็บไว้ในอ็อบเจ็กต์ Session โดยการระบุโค้ด Session[“Name”] เราจะตั้งชื่อให้กับคุณสมบัตินี้ว่า “Name” การกำหนดชื่อให้กับคุณสมบัตินี้จะทำให้เรียกใช้ค่าได้ง่ายขึ้นในภายหลัง
- บรรทัดถัดไปของโค้ดดึงค่าที่เก็บไว้จากวัตถุเซสชัน จากนั้นจะเขียนค่านี้ผ่านวิธี 'Response.Write' กลับไปยังไคลเอ็นต์
- สุดท้ายนี้ เราจะทำให้ปุ่มควบคุมทั้งหมดในแบบฟอร์มมองไม่เห็น หากเราไม่ทำเช่นนี้ ปุ่มควบคุมทั้งหมดรวมถึงค่าการตอบกลับจะแสดงพร้อมกัน
เมื่อคุณทำการเปลี่ยนแปลงข้างต้นเสร็จแล้ว คุณจะเห็นผลลัพธ์ดังต่อไปนี้
Output:
จากผลลัพธ์ คุณจะเห็นว่าค่าเซสชันของชื่อถูกดึงและแสดงในเบราว์เซอร์
โหมดสถานะเซสชันของ ASP.NET
ASP.NET สามารถจัดเก็บข้อมูลเซสชันได้หลายที่ ซึ่งเรียกว่าโหมดสถานะเซสชัน โหมดที่คุณเลือกจะมีผลต่อประสิทธิภาพ ความสามารถในการขยายขนาด และว่าข้อมูลจะยังคงอยู่หรือไม่หลังจากรีสตาร์ทแอปพลิเคชัน ตารางด้านล่างนี้เปรียบเทียบโหมดต่างๆ:
| โหมด | ตำแหน่งที่เก็บสถานะ | เหมาะสำหรับ |
|---|---|---|
| อินโปรค | ในหน่วยความจำของเว็บเซิร์ฟเวอร์ (ค่าเริ่มต้น) | แอปพลิเคชันแบบเซิร์ฟเวอร์เดี่ยว เร็วที่สุด แต่จะสูญเสียข้อมูลเมื่อรีสตาร์ท |
| สเตทเซิร์ฟเวอร์ | กระบวนการบริการสถานะ ASP.NET แยกต่างหาก | เว็บฟาร์ม; สามารถทนต่อการรีสตาร์ทแอปพลิเคชันได้ |
| SQLเซิร์ฟเวอร์ | ฐานข้อมูล SQL Server | เว็บฟาร์มที่ต้องการสถานะที่ทนทานและปรับขนาดได้ |
| แผ่นกระดาษ | ผู้ให้บริการแบบกำหนดเองที่คุณใช้งาน | ร้านค้าเฉพาะทาง เช่น Redis |
| Off | สถานะเซสชันถูกปิดใช้งาน | แอปพลิเคชันที่ไม่ต้องใช้เซสชัน |
InProc เป็นค่าเริ่มต้นและเร็วที่สุด แต่สำหรับการใช้งานแบบโหลดบาลานซ์ StateServer หรือ SQLServer จะช่วยให้เซสชันพร้อมใช้งานบนเซิร์ฟเวอร์หลายเครื่อง
วิธีการตั้งค่าการหมดเวลาของเซสชันใน ASP.NET
เซสชันไม่ได้คงอยู่ตลอดไป มันจะหมดอายุหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง คุณสามารถตั้งค่าการหมดอายุนี้ได้ในไฟล์ web.config โดยใช้ element sessionState โดยค่าการหมดอายุจะมีหน่วยเป็นนาที:
<configuration> <system.web> <sessionState mode="InProc" timeout="20" /> </system.web> </configuration>
คุณสามารถตั้งค่าในโค้ดได้เช่นกันด้วย Session.Timeout = 30;ค่าเริ่มต้นของการหมดเวลาคือ 20 นาที การเลือกเวลาหมดเวลาที่สั้นกว่าจะช่วยเพิ่มพื้นที่ว่างในหน่วยความจำของเซิร์ฟเวอร์ได้เร็วขึ้นและเพิ่มความปลอดภัย ในขณะที่การเลือกเวลาหมดเวลาที่ยาวกว่าจะทำให้ผู้ใช้ล็อกอินค้างไว้ได้นานขึ้น
ข้อดีและข้อเสียของการประชุมสภา
สถานะเซสชันนั้นสะดวก แต่ก็มีข้อดีข้อเสียที่คุณควรพิจารณาก่อนที่จะพึ่งพามันมากเกินไป
ข้อดี:
- ใช้งานง่ายสำหรับการจัดเก็บข้อมูลส่วนบุคคลของผู้ใช้ เช่น ข้อมูลร้านค้าping รายละเอียดตะกร้าสินค้าหรือรายละเอียดการเข้าสู่ระบบ
- สามารถจัดเก็บวัตถุที่ซับซ้อนได้ ไม่ใช่แค่สตริงเท่านั้น
- ข้อมูลถูกจัดเก็บไว้บนเซิร์ฟเวอร์ ดังนั้นจึงมีความปลอดภัยมากกว่าการจัดเก็บไว้ที่ฝั่งไคลเอ็นต์
ข้อเสีย:
- โหมด InProc ใช้หน่วยความจำของเซิร์ฟเวอร์มาก และไม่สามารถปรับขนาดได้ทั่วทั้งเว็บฟาร์ม
- ข้อมูลในเซสชันจะสูญหายเมื่อเซสชันหมดเวลาหรือแอปพลิเคชันเริ่มต้นใหม่ (ในโหมด InProc)
- การจัดเก็บข้อมูลจำนวนมากต่อผู้ใช้หนึ่งรายอาจส่งผลเสียต่อประสิทธิภาพการทำงานเมื่อมีการใช้งานหนัก



