ฉันควรทำอย่างไรหากเซสชัน ASP.NET ปัจจุบันเป็นโมฆะ


125

ในเว็บแอปพลิเคชันของฉันฉันทำสิ่งนี้เพื่ออ่านตัวแปรเซสชัน:

if (HttpContext.Current.Session != null &&  HttpContext.Current.Session["MyVariable"] != null)
{
    string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}

ฉันเข้าใจว่าเหตุใดจึงสำคัญที่ต้องตรวจสอบว่าเหตุใด HttpContext.Current.Session ["MyVariable"] จึงเป็นโมฆะ (ตัวแปรอาจยังไม่ได้รับการจัดเก็บใน Session หรือมีการรีเซ็ต Session ด้วยเหตุผลหลายประการ) แต่เหตุใดฉันจึงต้องตรวจสอบ ถ้าHttpContext.Current.Sessionเป็นโมฆะ?

ความเข้าใจของฉันคือเซสชันถูกสร้างขึ้นโดยอัตโนมัติโดย ASP.NET ดังนั้น HttpContext.Current.Session ไม่ควรเป็นโมฆะ สมมติฐานนี้ถูกต้องหรือไม่? ถ้ามันเป็นโมฆะได้หมายความว่าฉันควรตรวจสอบก่อนที่จะเก็บบางอย่างไว้ในนั้นหรือไม่:

if (HttpContext.Current.Session != null)
{
    HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
    // What should be done in this case (if session is null)?
    // Is it possible to force the session to be created if it doesn't exist?
}

ASP.NET WebApi จะมีพฤติกรรมที่แตกต่างกันคุณสามารถตรวจสอบได้ในการเข้าถึงเซสชันโดยใช้ ASP.NET Web API
Tiago Gouvêa

คำตอบ:


158

ใช่ออบเจ็กต์เซสชันอาจเป็นโมฆะ แต่ในบางสถานการณ์ซึ่งคุณแทบจะไม่พบเจอ:

หากคุณมีโค้ดในเพจเท่านั้นคุณจะไม่พบปัญหานี้ รหัส ASP .NET ส่วนใหญ่ของฉันใช้ Session โดยไม่ตรวจสอบค่า null ซ้ำ ๆ อย่างไรก็ตามมีบางอย่างที่ต้องพิจารณาหากคุณกำลังพัฒนา IHttpModule หรืออย่างอื่นอยู่ในรายละเอียดที่ชัดเจนกว่าของ ASP .NET

แก้ไข

ในคำตอบสำหรับความคิดเห็น: สถานะเซสชันจะพร้อมใช้งานหรือไม่นั้นขึ้นอยู่กับว่าเหตุการณ์ AcquireRequestState ทำงานสำหรับคำขอหรือไม่ นี่คือจุดที่โมดูลสถานะเซสชันทำงานโดยการอ่านคุกกี้เซสชันและค้นหาชุดตัวแปรเซสชันที่เหมาะสมสำหรับคุณ

AcquireRequestState ทำงานก่อนที่จะส่งการควบคุมไปยังเพจของคุณ ดังนั้นหากคุณกำลังเรียกใช้ฟังก์ชันอื่น ๆ รวมถึงคลาสแบบคงที่จากเพจของคุณคุณก็ไม่เป็นไร

หากคุณมีคลาสบางคลาสที่ใช้ตรรกะการเริ่มต้นในระหว่างการเริ่มต้นตัวอย่างเช่นในเหตุการณ์ Application_Start หรือโดยใช้ตัวสร้างแบบคงสถานะเซสชันอาจไม่พร้อมใช้งาน ทุกอย่างขึ้นอยู่กับว่ามีคำขอปัจจุบันหรือไม่และมีการเรียกใช้ AcquireRequestState หรือไม่

นอกจากนี้หากไคลเอนต์ปิดใช้งานคุกกี้วัตถุเซสชันจะยังคงใช้งานได้ - แต่ในคำขอถัดไปผู้ใช้จะกลับมาพร้อมกับเซสชันที่ว่างเปล่าใหม่ เนื่องจากลูกค้าจะได้รับ Session statebag หากเขายังไม่มี หากไคลเอนต์ไม่ขนส่งคุกกี้เซสชันเราจะไม่มีทางระบุว่าไคลเอนต์เหมือนกันได้ดังนั้นเขาจะถูกส่งต่อเซสชันใหม่ครั้งแล้วครั้งเล่า


6
เพียงแค่การอัปเดตอย่างรวดเร็วที่ฉันพบในวันนี้ ไม่มีเซสชันในตัวสร้างเพจ! เฉพาะในเหตุการณ์เริ่มต้นหรือหลังจากนั้น
Nuno Agapito

ฉันเพิ่งพบ HttpContext.Current.Session == null เป็นรหัสที่เรียกโดยเหตุการณ์ Page_Load ของเพจต้นแบบ เห็นได้ชัดว่าสิ่งนี้สามารถเกิดขึ้นได้ในบริบทของเพจ ถ้าฉันตรวจสอบวัตถุ HttpContext.Current สมาชิกส่วนใหญ่จะถูกเตรียมใช้งาน แต่ CurrentNotification และ IsPostNotification ทำให้เกิดข้อผิดพลาด: {System.PlatformNotSupportedException} ไม่ว่าจะเกิดจากสาเหตุใดปัญหานี้ไม่ได้เกิดขึ้นในการผลิตซึ่งดำเนินมาเป็นเวลาหลายปีแล้ว แพลตฟอร์มคือ Windows Server 2003 R2 SP2 แอปพลิเคชันมีกรอบเป้าหมาย. Net 3.5 และทำงานใน IIS โดยเปิดใช้งานสถานะเซสชัน
R. Schreurs

ฉันยังพบว่าเมื่อ IIS ให้บริการคำขอโดยตรงสำหรับไฟล์ทรัพยากรที่มีอยู่ในดิสก์เช่นสไตล์ชีตHttpContext.Current.Sessionสามารถเป็นค่าว่างสำหรับโค้ดใน `Application_AcquireRequestState ' อย่างไรก็ตามการร้องขอสำหรับเพจนั้นทำให้วัตถุเซสชันพร้อมใช้งานสำหรับโค้ดที่นั่น อยู่ภายใต้ MVC.NET 4 เป็นอย่างน้อย
ส่วนผสม

ฉันคิดว่ามันอาจเป็นโมฆะได้เช่นกันหากคุณอยู่ในแอ็คชัน MVC ที่แคชเอาต์พุต
user2173353

40

ข้อความต่อไปนี้ไม่ถูกต้องทั้งหมด:

"ดังนั้นหากคุณเรียกใช้ฟังก์ชันอื่น ๆ รวมถึงคลาสแบบคงที่จากเพจของคุณคุณน่าจะสบายดี"

ฉันกำลังเรียกใช้เมธอดแบบคงที่ที่อ้างอิงเซสชันผ่าน HttpContext.Current.Session และเป็นโมฆะ อย่างไรก็ตามฉันกำลังเรียกใช้เมธอดผ่านวิธีการบริการเว็บผ่าน ajax โดยใช้ jQuery

ดังที่ฉันพบที่นี่คุณสามารถแก้ไขปัญหาด้วยแอตทริบิวต์ง่ายๆในวิธีการหรือใช้วัตถุเซสชันบริการเว็บ:

มีเคล็ดลับในการเข้าถึงสถานะเซสชันภายในวิธีการเว็บคุณต้องเปิดใช้งานการจัดการสถานะเซสชันดังนี้:

[WebMethod (EnableSession = true)]

เมื่อระบุค่า EnableSession ตอนนี้คุณจะมีเซสชันที่มีการจัดการเพื่อเล่นด้วย หากคุณไม่ระบุค่านี้คุณจะได้รับอ็อบเจ็กต์เซสชันว่างและมากกว่าจะพบข้อยกเว้นการอ้างอิงที่เป็นค่าว่างในขณะที่พยายามเข้าถึงวัตถุเซสชัน

ขอบคุณ Matthew Cozier สำหรับการแก้ปัญหา

แค่คิดว่าฉันจะเพิ่มสองเซ็นต์ของฉัน

เอ็ด


1
ขอบคุณเอ็ดเซสชันปรากฏเป็นโมฆะในวิธีการทางเว็บ - การเพิ่มสิ่งนี้ได้รับการแก้ไขแล้ว +1
fusi

1
เมื่อคุณโทรเข้าสู่บริการเว็บคุณใช้คำขออื่นนอกเหนือจากหน้าดังนั้นคำสั่งนั้นยังคงถูกต้อง IMO
แห้ง

เอกสาร MSDN นี่the default value is false - ใช้งานได้เหมือนมีเสน่ห์
Benjineer

22

หากอินสแตนซ์เซสชันของคุณเป็นโมฆะและอยู่ในไฟล์ 'ashx' ให้ใช้อินเทอร์เฟซ 'IRequiresSessionState'

อินเทอร์เฟซนี้ไม่มีสมาชิกดังนั้นคุณต้องเพิ่มชื่ออินเทอร์เฟซหลังจากการประกาศคลาส (C #):

public class MyAshxClass : IHttpHandler, IRequiresSessionState

ขอบคุณมากเซสชันเป็นโมฆะในคลาสล็อกอินของฉัน เมื่อฉันเพิ่มรหัสนี้ในตัวจัดการ ashx ของฉันมันก็เปิดเซสชันในชั้นเรียนของฉันด้วย
AteşDanış

ฉันคิดว่านี่ตอบคำถามได้ดีทีเดียว ขอบคุณมาก.
Sachin Joseph

2

บทความทางเทคนิค ASP.NET

สรุป: ใน ASP.NET ทุกเว็บเพจมาจากคลาส System.Web.UI.Page คลาสเพจจะรวมอินสแตนซ์ของอ็อบเจ็กต์ HttpSession สำหรับข้อมูลเซสชัน คลาสเพจแสดงเหตุการณ์และวิธีการต่างๆสำหรับการปรับแต่ง โดยเฉพาะอย่างยิ่งเมธอด OnInit ใช้เพื่อตั้งค่าสถานะเริ่มต้นของวัตถุเพจ หากคำขอไม่มีคุกกี้เซสชันคุกกี้เซสชันใหม่จะออกให้กับผู้ร้องขอ

แก้ไข:

เซสชัน: แนวคิดสำหรับผู้เริ่มต้น

สรุป: เซสชันถูกสร้างขึ้นเมื่อผู้ใช้ส่งคำขอแรกไปยังเซิร์ฟเวอร์สำหรับหน้าใด ๆ ในเว็บแอปพลิเคชันแอปพลิเคชันจะสร้างเซสชันและส่งรหัสเซสชันกลับไปยังผู้ใช้พร้อมกับการตอบกลับและถูกเก็บไว้ในเครื่องไคลเอนต์เป็นคุกกี้ขนาดเล็ก . ดังนั้นโดยหลักการแล้ว "เครื่องที่ปิดการใช้งานคุกกี้ข้อมูลเซสชันจะไม่ถูกเก็บไว้"


2

ในกรณีของฉันASP.NET State Serviceถูกหยุด การเปลี่ยนStartup typeไปAutomaticและเริ่มต้นการให้บริการด้วยตนเองเป็นครั้งแรกแก้ปัญหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.