В чем разница между этими двумя методами OnlineUsers в global.asax - PullRequest
0 голосов
/ 07 ноября 2011

Пожалуйста, смотрите мой global.asax:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using DataLayer;
using NiceFileExplorer.Classes;
using System.IO;
using System.Text;
using System.Data;
using System.Web.Hosting;

namespace NiceFileExplorer
{

    public class Global : System.Web.HttpApplication
    {

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

        protected void Session_Start(object sender, EventArgs e)
        {
            Application.Lock();

            OnlineUsers.InsertRow(
                Session.SessionID,
                DateTime.Now, //Session Start Time
                DBNull.Value, //Session End Time
                true);

            //OnlineUsers Is A Table In MS SQL SERVER 2008  

            //InsertRow  Is A StoredProcedure Of OnlineUsers Table Like Below :  


//    ALTER Procedure [dbo].[sp_OnlineUsers_Insert]
//    @Session_ID nvarchar(300),
//    @Session_Start datetime,
//    @Session_End datetime = NULL,
//    @Online bit
//As
//Begin
//    Insert Into OnlineUsers
//        ([Session_ID],[Session_Start],[Session_End],[Online])
//    Values
//        (@Session_ID,@Session_Start,@Session_End,@Online)

//    Declare @ReferenceID int
//    Select @ReferenceID = @@IDENTITY

//    Return @ReferenceID

//End

            Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
            Application.UnLock();
        }

        protected void Session_End(object sender, EventArgs e)
        {
            Application.Lock();

            OnlineUsers.UpdateRow_Some_Fields_By_SessionID(
                Session.SessionID,
                DateTime.Now,
                false);

//UpdateRow_Some_Fields_By_SessionID Is A StoredProcedure Of OnlineUsers Table Like Below :  

//    ALTER Procedure [dbo].[sp_OnlineUsers_Update_Some_Fields_By_SessionID]
//    @Session_ID nvarchar(300),
//    @Session_End datetime,
//    @Online bit
//As
//Begin
//    Update OnlineUsers
//    Set
//        [Session_End] = @Session_End,
//        [Online] = @Online
//    Where     
//        [Session_ID] = @Session_ID

//End

            Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
            Application.UnLock();
        }

        protected void Application_End(object sender, EventArgs e)
        {

        }

    }
}

Мне нужно добавить ярлыки в мой проект для отображения OnlineUsers!

1 использует:

Application["OnlineUsers"].ToString();

2 использует:

OnlineUsers.Count_Users().ToString();

    //Count_Users Is A StoredProcedure Of OnlineUsers Like Below :  
    //ALTER Procedure [dbo].[sp_OnlineUsers_Count]
    //    As
    //    Begin
    //        Select 
    //            [Session_ID],
    //            [Session_Start],
    //            [Session_End],
    //            [Online]
    //        From OnlineUsers
    //        Where 
    //            [Online] = 1

    //        Declare @Count int
    //        Select @Count = @@ROWCOUNT

    //        Return @Count
    //    End

SomeTimes Lable 1 показывает нас: 5
но Lable 2 показывает нам: 255

что я сделал с ними не так?
почему между ними большая разница?

EDIT
Мой sessionState в web.config выглядит так:

<sessionState mode="InProc" cookieless="false" timeout="1" />

заранее спасибо

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Session_End запускается только по истечении времени сеанса, поэтому отсчеты не совпадают.Попробуйте использовать Session.IsNewSession, чтобы отключить логику Session_End.

2 голосов
/ 07 ноября 2011

Скорее всего, ваша таблица OnlineUsers содержит большое количество пользователей, которые никогда не очищались.

Session_End не очень надежное событие и не выполняется 100% времени. Например, если приложение неожиданно останавливается, оно не будет запускать Session_End для каждого открытого сеанса. После этого вы получите список пользователей, застрявших в OnlineUsers, которые никогда не будут очищены. Приложение ["OnlineUsers"], конечно, также не будет очищено, но если ваше приложение перезапускается, тогда оно будет установлено в 0, так что вы не заметите такой большой разницы.

...