2009-03-26 34 views
5

Trên trang ASP.NET, một số kỹ thuật có thể được sử dụng để theo dõi số lượng người dùng đã đăng nhập vào trang tại bất kỳ thời điểm nào?Xác định số người dùng 'hoạt động' của trang ASP.NET

Vì vậy, ví dụ, tôi có thể tạo ra một báo cáo cho thấy một cái gì đó như thế này:

 10:00am 11:00am 12:00pm 1:00pm 2:00pm .... 
3/25  25  32  45  40  37 
3/26  31  38  50  57  40 
3/27  28  37  46  35  20 
etc. 

EDIT: Không, chúng tôi không sử dụng nhà cung cấp ASP.NET Membership, nó sử dụng một/phiên hacky cây nhà lá vườn dựa phương pháp xác định người dùng có ở trạng thái 'đăng nhập' hay không.

Trả lời

8

Trang web có đăng nhập người dùng không? Nếu có, thì bạn có thể cập nhật trường "Lần truy cập cuối cùng" trong bảng người dùng mỗi khi họ yêu cầu trang mới và sau đó mỗi giờ, chỉ cần thực hiện truy vấn SQL lấy tất cả những người có dấu thời gian "Lần truy cập cuối cùng" trong 15 phút hoặc lâu hơn (giả định hiện đang ở trên trang web).

Nếu bạn không có người đăng nhập, bạn có thể dễ dàng thực hiện điều đó bằng địa chỉ IP thay vì tên người dùng. Tuy nhiên, với phương pháp này, bạn có thể gặp phải một số vấn đề proxy (nghĩa là nhiều người dùng từ cùng một mạng công ty có thể đến từ một địa chỉ IP duy nhất, vì vậy họ chỉ được tính là một người dùng trong tổng số của bạn).

+0

Và, nếu trang web là công khai, có những proxy lớn như AOL và quân đội. – Amy

+0

Thêm trường 'Lần truy cập trước' cập nhật thường xuyên có lẽ là cách tiếp cận mà chúng tôi sẽ thực hiện cho dự án này. Cảm ơn ý tưởng. –

3

Loại tùy thuộc vào trang web của bạn. Nếu bạn sử dụng các nhà cung cấp thành viên ASP.Net có một phương pháp: Membership.GetNumberOfUsersOnline() có thể cho bạn biết có bao nhiêu người dùng đã đăng nhập. Tôi tin rằng cũng có quầy hiệu suất. Khái niệm về người dùng đã đăng nhập là người dùng đã thực hiện điều gì đó trong vòng x phút cuối cùng, trong đó x có thể định cấu hình được.

Bạn cũng có thể sử dụng bộ đếm hiệu suất để theo dõi các yêu cầu gửi đến nếu bạn muốn biết được hoạt động của mình.

Sửa

Chỉ cần để bạn biết các nhà cung cấp thành viên SQL ASP thực hiện điều này bằng cách ghi lại một ngày hoạt động trên một lĩnh vực trong DB. Nó chỉ khi truy vấn nó cho tất cả các hoạt động trong vòng x phút.

Tôi đã thêm chức năng bỏ phiếu phía khách hàng truy cập máy chủ của chúng tôi sau mỗi 2 phút, vì vậy trong khi người dùng đang ngồi trên trang, tôi biết họ đang ở đó ngay cả khi không có hoạt động. Điều này cũng cho phép tôi buộc người dùng ra khỏi hệ thống, cung cấp một phương thức cung cấp các thông báo hệ thống khác. Rất tốt.

+0

Đây là thông tin tốt, vì vậy tôi sẽ +1 bạn, nhưng đối với mục đích của tôi ý tưởng rwmnau cung cấp là phù hợp hơn cho kịch bản cụ thể của tôi. –

+0

Tôi cũng sẽ +1 - tôi đã không cân nhắc điều gì đó thăm dò ý kiến ​​của phía khách hàng để thực sự xem họ có còn ở đó không. Tôi đã luôn luôn thấy rằng làm mới trang gần đây nhất là một chỉ báo khá đáng tin cậy, nhưng nếu bạn đã có băng thông để ghi, phương pháp này thậm chí còn chính xác hơn. – SqlRyan

+0

Poller của tôi thực sự là phương pháp để hạn chế đăng nhập đồng thời ... người cuối cùng ở trong tình huống. Chúng tôi có một chương trình cấp phép cho mỗi người dùng cho các công ty ... một loại ... – JoshBerke

1

Tôi nghĩ rằng những gì tôi đã sử dụng trong quá khứ là các chức năng Global.asax chủ yếu tập trung xung quanh Session_Start và Session_End, tăng số lượng với Bắt đầu, và sau đó kết thúc là một chút khó khăn vì thời gian chờ phiên. Nếu bạn không quan tâm nhiều đến việc đếm chính xác thì bạn có thể dừng ở đây.

Nếu không thì bạn có thể sử dụng kết hợp sự kiện javascript onUnload với một số loại yêu cầu ajax để làm mất hiệu lực phiên và trừ người dùng. Sự kiện sẽ phải xem liệu người dùng có thực sự rời khỏi trang hay chỉ truy cập một trang khác trên trang web.

Dù sao, hãy bắt đầu ở đó. Tôi nhớ phải làm gì với các trang web ASP vì vậy chắc chắn có một số thông tin hiện có trên phương pháp này.

1

màn hình hiệu suất thống kê cho Phiên hoạt động trong đối tượng hiệu suất ASP.NET và bạn có thể theo dõi tất cả các phiên bản hoặc ứng dụng riêng lẻ.Bạn có thể truy cập các thống kê này thông qua Công cụ quản trịHiệu suất hoặc lập trình qua WMI.

Một kịch bản PowerShell rất cơ bản để có được như vậy tổng cộng quầy ví dụ:

(Get-WmiObject Win32_PerfRawData_ASPNET_ASPNETApplications SessionsActive).SessionsActive 

Một bộ lọc sẽ có thể để có được những stat cho một trang web cụ thể.

+0

Bất kỳ mã mẫu nào sử dụng 'lập trình' qua WMI đến ** màn hình hiệu suất **? – Kiquenet

0

Đặt thời gian chờ phiên đầu tiên trong 1 phút.

Tạo một trang heartbeat.aspx đơn giản không có nội dung HTML chỉ là mã javascript sau:

<html> 
    <head> 
    <script language="javascript"> 
    function reloadPage() 
    { 
    window.navigate("heartbeat.aspx"); 
    } 
    </script> 
    </head> 
<body onload="window. setTimeout(‘reloadPage()’, 30000)"> 
</body> 
</html> 

này sẽ tái yêu cầu bản thân mỗi 30 giây và tiếp tục phiên còn sống.

Đặt trang heatbeat.aspx trong khung ẩn.

Để nhận số người dùng chỉ nhận số phiên bằng cách sử dụng bộ đếm tĩnh trong các sự kiện Session_Start và Session_End trong Global.asax.

+1

Tại sao không chỉ có một yêu cầu phía khách hàng asynchornous (AJAX) nhấn một dịch vụ trên lưng hoặc một ashx ... tại sao lại có một khung khác. – JoshBerke

0

Nếu bạn đang sử dụng trạng thái phiên InProc, bạn có thể làm điều đó như thế này trong global.asax

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
    Application("ActiveSessionCount") = 0 
End Sub 

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) 
    Application("ActiveSessionCount") += 1 
End Sub 

Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) 
    Application("ActiveSessionCount") -= 1 
End Sub 

Để truy cập giá trị trên một mẫu web chỉ đơn giản

Dim Count as Integer = Application("ActiveSessionCount") 
+0

tôi đã thử điều này và trên mỗi làm mới truy cập được incrementing –

2

Nếu sử dụng SQL Server cho phiên lưu trữ (tức là chế độ <sessionState> là "SQLServer" trong web.config), bạn không thể sử dụng giải pháp dựa trên Session_End trong global.asax, vì phương pháp này sẽ không bao giờ được gọi.

Tuy nhiên, giả định rằng SQL Agent đang chạy DeleteExpiredSessions công việc một cách chính xác (mà nó nên theo mặc định khi SQL Nhà nước đã được cài đặt), bạn có thể chỉ cần chạy các lệnh SQL sau so với phiên Db:

SELECT COUNT(SessionId) FROM ASPStateTempSessions 
+0

*** SessionId *** là gì? giá trị 'HttpContext.Current.Session.SessionID' là gì? – Kiquenet

0
public class ActiveUsers 
{ 
    private static List<LastUserActivity> users; 
    private static object syncroot = new object(); 
    private static DateTime lastPruned; 

    public static int SessionLength = 20; 

    static ActiveUsers() 
    { 
     users = new List<LastUserActivity>(); 
     lastPruned = DateTime.UtcNow; 
    } 

    public void RecordUserActivity(int userId) 
    { 
     lock (syncroot) 
     { 
      var user = users.FirstOrDefault(x => x.UserId == userId); 
      if (user == null) 
      { 
       user = new LastUserActivity() { UserId = userId }; 
       users.Add(user); 
      } 
      user.UtcTime = DateTime.UtcNow; 

      if (lastPruned.AddMinutes(5) < DateTime.UtcNow) 
      { 
       Prune(); 
       lastPruned = DateTime.UtcNow; 
      } 
     } 
    } 

    private static void Prune() 
    { 
     users.RemoveAll(x => x.UtcTime.AddMinutes(SessionLength) < DateTime.UtcNow); 
    } 

    public int GetActiveUsers() 
    { 
     lock (syncroot) 
     { 
      return users.Count; 
     } 
    } 
} 
public class LastUserActivity 
{ 
    public int UserId { get; set; } 
    public DateTime UtcTime { get; set; } 
} 

Thêm cuộc gọi vào ActiveUsers thành phương thức trong global.asax (ví dụ: BeginRequest, AcquireRequestState).

0

On Global.asax

protected void Application_Start(object sender, EventArgs e) 
     { 
      Application["SessionCount"] = 0; 
     } 

     protected void Session_Start(object sender, EventArgs e) 
     { 
      Application.Lock(); 
      Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) + 1; 
      Application.UnLock(); 
     } 

     protected void Session_End(object sender, EventArgs e) 
     { 
      Application.Lock(); 
      Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) - 1; 
      Application.UnLock(); 
     } 

Nhận Application [ "SessionCount"] trên trang bạn muốn

Các vấn đề liên quan