簡體   English   中英

HttpApplication class 的Application 屬性可以用來計算當前活躍用戶嗎?

[英]Can Application property of HttpApplication class be used to calculate current Active Users?

我在 ASP.NET web forms Global.aspx 頁面中使用以下代碼來計算當前活躍用戶的數量。 當我進行本地測試時,它確實有效。

理解是Application是Application級別的變量,可以在應用級別訪問。 因此存儲在一個 session 中的值將在其他會話中可用。

<%@ Application Language="C#" %>  
  
<script runat="server">  
  
    void Application_Start(object sender, EventArgs e)   
    {  
        // Code that runs on application startup  
        Application["TotalOnlineUsers"] = 0;  
    }  
      
    void Application_End(object sender, EventArgs e)   
    {  
        //  Code that runs on application shutdown  
  
    }  
          
    void Application_Error(object sender, EventArgs e)   
    {   
        // Code that runs when an unhandled error occurs  
  
    }  
  
    void Session_Start(object sender, EventArgs e)   
    {  
        // Code that runs when a new session is started  
        Application.Lock();  
        Application["TotalOnlineUsers"] = (int)Application["TotalOnlineUsers"] + 1;  
        Application.UnLock();  
    }  
  
    void Session_End(object sender, EventArgs e)   
    {  
        // Code that runs when a session ends.   
        // Note: The Session_End event is raised only when the sessionstate mode  
        // is set to InProc in the Web.config file. If session mode is set to StateServer   
        // or SQLServer, the event is not raised.  
        Application.Lock();  
        Application["TotalOnlineUsers"] = (int)Application["TotalOnlineUsers"] - 1;  
        Application.UnLock();  
    }  
         
</script>

但是在通過這個鏈接https://docs.microsoft.com/en-us/dotnet/api/system.web.httpapplication?redirectedfrom=MSDN&view=netframework-4.8時,它說成員變量可用於存儲 per-請求數據

基於此聲明和下面的完整段落,單個應用程序可以有多個 HttpApplication 實例,如果沒有,應用程序將非常慢,因為一個 HttpApplication 實例在一個時間點只能處理一個請求

因此,每個 HttpApplication 都有自己的 Application 變量,並且計數將保存在 HttpApplication 級別。

HttpApplication class 的實例是在 ASP.NET 基礎架構中創建的,而不是由用戶直接創建的。 HttpApplication class 的一個實例用於在其生命周期內處理許多請求。 但是,它一次只能處理一個請求。 因此,成員變量可用於存儲每個請求的數據。

應用程序引發的事件可由實現 IHttpModule 接口的自定義模塊或由 Global.asax 文件中定義的事件處理程序代碼處理。 實現 IHttpModule 接口的自定義模塊可以放在 App_Code 文件夾中或 Bin 文件夾中的 DLL 中。

那么,為了得到准確的計數而不會有任何錯誤計算的機會,我應該使用 static 變量嗎?

我相信您的代碼將正常工作,假設您使用的是 InProc session state 並且不在 Web 場中運行。

令人困惑的是,“應用程序”一詞可以具有三種不同的含義:

  1. 您的 Web 應用程序(即整個 Web 站點)
  2. 向您的 Web 應用程序提供請求的多個HttpApplication實例之一
  3. HttpApplication.Application屬性

當文檔說 Application 屬性返回“應用程序的當前 state”時,這意味着您的 Web 應用程序,而不是單個 HttpApplication 實例。

確實,如果將成員變量添加到全局 class(繼承自 HttpApplication),則該成員變量將不會在 HttpApplication 實例之間共享。 但是 Application 屬性很特殊:無論您使用哪個 HttpApplication 實例訪問該屬性,它都會返回相同的 HttpApplicationState object。 因此,您通過 Application 屬性添加的任何值都將在所有 HttpApplication 實例之間共享。 (這就是為什么您必須調用 Lock 和 UnLock 來同步訪問;如果 HttpApplicationState object 未共享,則不需要這樣做。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM