2015-09-22 38 views
1

我使用以下代碼來計算我的ASP.NET(2.0/3.5)應用程序(ASMX Web服務,遺留代碼)中當前打開的會話的數量,但如果它足夠長,計數停止匹配內置的性能計數器(我的計數較高,Session_End似乎有時不會被調用)。會議是InProc。我可能會錯過什麼?天真的ASP.NET會話計數錯誤

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     Application["OpenSessionCount"] = 0; 
    } 

    protected void Session_Start(Object sender, EventArgs e) 
    { 
     Application.Lock(); 
     Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] + 1; 
     Application.UnLock(); 

     /* Set other Session["foo"] = bar data */ 

    } 

    protected void Session_End(Object sender, EventArgs e) 
    { 
     Application.Lock(); 
     Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] - 1; 
     Application.UnLock(); 
    } 
} 

「只要使用性能計數器!」

是的,我只是問,因爲我很好奇我錯了什麼地方。

回答

1

的Session_End中調用兩種情況:

  • 當Session.Abandon()被調用的會話過期

  • 立即如果你關閉瀏覽器時,Seesion_End事件火會話過期時。
    請參閱MSDN lib

  • +0

    是否還有其他方法可讓會議結束?我不認爲有任何。 –

    +0

    您可以使用javascript監視關閉瀏覽器事件,並使用Session.Abandon()rotine向註銷頁面發送請求。 [關閉事件示例](http://stackoverflow.com/questions/1631959/how-to-capture-the-browser-window-close-event) –

    +0

    感謝里卡多的建議,但這是一個Web服務不是網絡應用程序,所以沒有瀏覽器事件。另外,因爲我已經更新了Session_End()中的計數,所以註銷(它調用Session.Abandon())和會話超時都會被照顧。我試圖找出什麼可能會結束一個會議,而不會調用Session_End。在更新計數之前Session_End中的異常可能會執行此操作,但更新幾乎是第一次認爲代碼執行的操作,所以我沒有看到可能發生異常的位置。 –

    0

    會話實際上並不開始,除非您在Session字典中存儲了某些內容。因此,對於實際上沒有分配會話對象的任何事件,您都不會得到Session_End事件。

    MSDN

    當使用基於cookie的會話狀態,ASP.NET不直到會話對象用於分配用於會話的數據存儲。因此,會爲每個頁面請求生成一個新的會話ID,直到訪問會話對象。如果您的應用程序需要整個會話的靜態會話ID,則可以在應用程序的Global.asax文件中實現Session_Start方法,並將數據存儲在Session對象中以修復會話ID,或者可以在您的另一部分中使用代碼應用程序顯式地將數據存儲在Session對象中。

    public class Global : System.Web.HttpApplication 
    { 
        protected void Application_Start(object sender, EventArgs e) 
        { 
         Application["OpenSessionCount"] = 0; 
        } 
    
        protected void Session_Start(Object sender, EventArgs e) 
        { 
         Application.Lock(); 
    
         // Store something every time to ensure the Session object is allocated. 
         HttpContext.Current.Session["dummy"] = "Foo"; 
         Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] + 1; 
         Application.UnLock(); 
    
         /* Set other Session["foo"] = bar data */ 
    
        } 
    
        protected void Session_End(Object sender, EventArgs e) 
        { 
         Application.Lock(); 
         Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] - 1; 
         Application.UnLock(); 
        } 
    } 
    

    參考:ASP.NET: Session.SessionID changes between requests

    +0

    我們在Session_Start()中的會話中設置了一個值,但是我們在增量後執行該值。這應該有所作爲嗎? –

    +0

    我不這麼認爲。我指出的情況是,你有什麼條件決定是否在會話中存儲某些內容。如果你不這樣做,那麼你實際上並沒有開始一個會話。 – NightOwl888