นับจำนวนคนออนไลน์ใน asp.net ด้วย Global.asax


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 นาที (หรือเปล่า) ถ้าใครต้องการทำแบบนี้ก็ลองนำไปใช้ดูนะครับ

หมายเลขบันทึก: 194299เขียนเมื่อ 15 กรกฎาคม 2008 14:03 น. ()แก้ไขเมื่อ 6 กันยายน 2013 19:17 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (8)
แล้วถ้านับจำนวนคนดู (webboard) ล่ะคะ

นับจากฐานข้อมูล SQL Server ยังไงคะ

ไม่รู้ว่าวิธีนี้จะพอใช้ได้หรือเปล่านะครับ

1.ถ้าอยากให้มีการเก็บลง Database เราก็สร้าง Table สำหรับเก็บคนที่ออนไลน์เอาไว้ก่อน

2.เมื่อมีคน Login เข้ามาในระบบหรือว่าเข้าใช้งานต่างๆ เราก็ส่ง Session และเวลาเข้าไปเก็บ ทีใช้ Session เพราะว่ามันไม่มีทางซ้ำกันครับ

3.ตอนที่เราเก็บลง DB เราก็เราก็เช็คด้วยว่าถ้ามี records ที่เวลาเกินที่เรากำหนดไว้ให้ลบทิ้งไป

4.แบบนี้เราก็จะได้จำนวนคนที่ค่อนข้างจะ realtime แล้วครับ

งงป่าวครับ งงส่งเมล์มาถามได้นะค๊าบ อิอิ

งั้นถ้าผมต้องการจะ check user คนไหน login เข้าระบบ กี่คน อะครับ เพราะ codeที่ให้มันนั้นมันแสดง user ที่เข้า web เรา แต่ผมต้องการ check user ที่ login ผ่านระบบ อะครับ

ทำแบบ ความเห็นที่สองเลยครับ ใช้ session เข้ามาช่วย เก็บลงฐานข้อมูล ข้อมูลที่ได้ก็จะค่อนข้างแน่นอนครับ

อยากได้ code แบบเต็มๆ อย่างที่คุณอั่นว่าอะครับ..รบกวนผู้รู้ช่วยหน่อยนะครับ

ขอบคุณครับ [email protected]

พอดีไม่ได้เขียนไว้น่ะครับ แต่ใช้หลักการที่ตอบใน comment ที่สองได้เลยครับ

เคยลองเขียนแล้ว แต่ว่าไม่ได้เอา Code มา ^ ^

ขอบคุณ คุณ ws มากเลยนะครับ ยังไงผมจะลอง ทำดูนะครับ..

แต่ถ้าไม่ได้ยังไง คงต้องรบกวน คุณ ws อีกครั้งหนึงแล้วหละครับ..

ขอบคุณครับ

ต้องรบกวน คุณ ws อีกครั้งหนึ่ง ขอ code แบบ เต็มๆ หน่อยนะครับ คือผม พึ่งเริ่ม เล่น aspx หนะครับ.

ยังไง ก็ขอขอบคุณล่วงหน้านะครับ.. ขอบคุณครับ..

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท