How to show current user online in asp.net web site.

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

โดยในการทำงานนั้นเราต้องสร้างไฟล์ Global.asax ให้กับโปรเจคก่อน โดยไปคลิกขวาที่โปรเจคใน Solution Explorer แล้วเลือก Add New Item เราก็จะได้หน้าต่างสำหรับสร้างไฟล์ขึ้นมาให้เราเลือกไปที่ Global Application Class เหมือนในรูป

Global Application Class

ไฟล์ Global.asax ที่ได้มานั้นจะทำงานเมื่อมีการเปิดเข้ามาใช้งานในโปเจคนี้ครั้งแรกด้วย Application_OnStart จากนั้นหากมีเครื่องผู้ใช้งานเข้ามาเรื่อยๆ Session_OnStart จะถูกเรียกขึ้นมาทำงาน และหากมีการหยุดกาใช้งาน Session_OnEnd ก็จะถูกเรียกขึ้นมาทำงาน และท้ายสุดหากมีการหยุดการทำงานทั้งหมด Application_OnEnd ก็จะทำงานเป็นลำดับสุดท้าย

เมื่อรู้เรื่องของ Global.asax คร่าวๆแล้วทีนี้เรามาดูการเขียนเพื่อให้เราสามารถนับจำนวนคนเข้าใช้งานเว็บแบบง่ายๆกันเลยครับ

1. ลำดับแรกเราต้องเขียนเพื่อนกำหนดให้เริ่มการทำงานเมื่อมีการเริ่มใช้งานโปเจคด้วยโค้ดด้านล่างนี้ เพื่อให้เซิร์ฟเวอร์เริ่มทำการนับจำนวนคนที่เข้าใช้งาน

void Application_Start(object sender, EventArgs e) {
       Application("OnlineUser") = 0;
}


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

void Session_Start(object sender, EventArgs e) {
       Application.Lock();
       Application("OnlineUser") = Convert.ToInt16(Application("OnlineUser")) + 1;
       Application.UnLock();
}

โดยในทุกครั้งที่เราจะทำการใช้งานตัวแปรต่างๆที่ Global เราต้องทำการสั่ง Application.Lock() เพื่อให้เราสามารถใช้งานตัวแปรนั้นได้เพียงผู้เดียว จะได้ไม่เกิดปัญหาในการแย่งกันใช้งานตัวแปร เพราะเนื่องมาจากเป็นตัวแปรที่ทุกๆหน้าสามารถเข้าถึงได้ เมื่อใช้งานเสร็จแล้วก็ให้ปลดล๊อคตัวแปรด้วย

3. หากมี Session ของคนใดหมดอายุการใช้งานไป ระบบจะทำการลบผู้ใช้งานนั้นออกจากการ Online โดยทำในลักษณะคล้ายๆกับตอนบวกค่าเพิ่มให้ดังนี้

void Session_End(object sender, EventArgs e) {
       Application.Lock();
       Application("OnlineUser") =  Convert.ToInt16(Application("OnlineUser")) - 1;

       Application.UnLock();       
}


4. ซึ่งในตอนนี้เราก็จะได้จำนวนของผู้ใช้งานที่กำลังใช้งานคร่าวๆได้แล้วละครับ ให้เราลองไปทำงานเรียกตัวแปรเพื่อนำไปแสดงผล ในหน้าที่เราต้องได้เลยครับ

intOnline = Application(("OnlineUser");
lblOnlineUser.Text = intOnline.ToString();


จำนวนคนที่ออนไลน์จะนับจากจำนวน Session ที่คงอยู่ในระบบนะครับ ถ้าเราไม่ได้กำหนดเพิ่มมันจะอยู่ที่ 20 - 30 นาที (หรือเปล่า) ถ้าใครต้องการทำแบบนี้ก็ลองนำไปใช้ดูนะครับ