ถ้าเป็นเรื่องปิด Browser หรือว่า User ไปเปิดเวบอื่นคงไม่มีปัญหาครับ เพราะ ASP.NET มันจะเคลียร์ค่าให้เมื่อ Session Time Out อยู่แล้ว ซึ่งเราก็สามารถเขียนโค้ดใน Session_End ที่ Global.asax เพิ่มเติมก็ได้ แต่ปัญหาคือถ้า user เปลี่ยนหน้า เราจะทำยังไงดี สิ่งแรกที่ผมคิดคือ เรากำหนดให้มัน Post Back กลับมาหน้าเดิมก่อน เพื่อสั่ง Clear Session จากนั้นเราค่อยสั่ง Navigate ไปยังหน้าที่ต้องการอีกที
เช่นสมมติ เรามี User Control 1 ตัว เป็นเมนูสำหรับ Application เราใช้ <asp: Menu> และสร้าง <asp:MenuItem> เพื่อระบุเมนูย่อย แทนที่เราจะใช้ NavigateUrl Attribute เพื่อสั่ง Redirect ไปหน้าใหม่ทันที่ เราก็มาเขียนโค้ดที่ MenuItemClick Event แทนครับ
พอตอนเย็นก็นึกวิธีใหม่ออก ก็เลยมาลองดูครับ วิธีนี้คือ เราใช้ ASP.NET AJAX มาเรียก WebService เพื่อทำการ Clear Session นั่นเองครับ ลองมาดูโค้ดของ WebService กันก่อน
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Namespace jNithi.WS
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class SessionManager
Inherits System.Web.Services.WebService
<Script.Services.ScriptMethod()> _
<WebMethod()> _
Public Function ClearSession(ByVal sessionName As String) As Boolean
Dim session As System.Web.SessionState.HttpSessionState
session = System.Web.HttpContext.Current.Session
If session(sessionName) IsNot Nothing Then
Select Case sessionName.ToUpper
Case "SESSION_RECEIPT_REPORT"
DirectCast(session(sessionName), CrystalDecisions.CrystalReports.Engine.ReportDocument).Dispose()
Case "SESSION_RECEIPT_DATA"
DirectCast(session(sessionName), IList).Clear()
Case Else
End Select
session(sessionName) = Nothing
session.Remove(sessionName)
End If
End Function
End Class
End Namespace
ทีนี้ในหน้า aspx เราก็เขียน javascript สำหรับมาเรียก Webservice ตัวนี้ครับ
<script type="text/javascript">
function Body_OnUnload() {
jNithi.WS.SessionManager.ClearSession('SESSION_RECEIPT_REPORT');
}
</script>
</head>
<body onunload="Body_OnUnload();">
<form id="form1" runat="server">
<asp:ScriptManager ID = "ScriptManager1" runat="server" >
<services>
<asp:ServiceReference Path="~/wsSession.asmx" />
</services>
</asp:ScriptManager>
เท่าที่ลองทดสอบดู ก็ใช้งานได้ผลโอเคนะครับ เมื่อเราเปลี่ยนหน้า หรือปิด Browser มันจะไปเรียก WebService เพื่อสั่ง Clear Session ให้ แต่มีข้อแม้นิดหนึ่งครับ คือ onunload event ของ Body นั้นมันจะทำงานทุกครั้งที่มีการเปลี่ยนหน้า นั่นคือ ถ้ามีการ PostBack กลับไป มันก็จะเกิด Event นี้ด้วยครับ แต่ถ้าเราออกแบบ ASP.NET AJAX Page ของเราดีๆ ไม่ให้มีการ Post Back กลับไป แนวคิดนี้ก็ทำงานได้โอเคครับ
เดี๋ยวคงต้องขอทดสอบอีกซักพัก ก่อนจะเอาไปใช้จริงครับ
1 ความคิดเห็น:
วิธีที่ใช้ Web Service ลบ Session ได้ผลดีหรือป่าวค่ะ ถ้าใช้งานผ่านจะได้นำแนวคิดนี้ไปใช้งานบ้างค่ะ
แสดงความคิดเห็น