C# 计算web应用程序的联机用户数

C# 计算web应用程序的联机用户数,c#,asp.net,.net,session,visual-studio-2008,C#,Asp.net,.net,Session,Visual Studio 2008,我正在使用ASP.Net+.NET3.5+VS2008+IIS7.0+C来开发一个web应用程序。我想统计一下有多少用户在线。这是我目前的做法, 当调用Session_Start时,我将在线用户数增加1 当调用Session_End时,我将在线用户数减少1 两个问题, A该实现是否正确 B.另一个问题是,我认为这种方法无法实时跟踪用户的情况,因为当用户关闭浏览器时,不会立即调用Session_End(Session_End将延迟调用)。正确吗?您是否使用ASP.NET成员资格 Membershi

我正在使用ASP.Net+.NET3.5+VS2008+IIS7.0+C来开发一个web应用程序。我想统计一下有多少用户在线。这是我目前的做法,

  • 当调用Session_Start时,我将在线用户数增加1
  • 当调用Session_End时,我将在线用户数减少1
  • 两个问题,

    A该实现是否正确


    B.另一个问题是,我认为这种方法无法实时跟踪用户的情况,因为当用户关闭浏览器时,不会立即调用Session_End(Session_End将延迟调用)。正确吗?

    您是否使用ASP.NET成员资格

    Membership.GetNumberOfUsersOnline()
    
    您可以在
    web.config
    中自定义用户被视为“在线”的时间量-例如

    <membership defaultProvider="..." 
                userIsOnlineTimeWindow="10" 
      <providers>
        ....
      </providers>
    </membership>
    

    您是否使用ASP.NET成员资格

    Membership.GetNumberOfUsersOnline()
    
    您可以在
    web.config
    中自定义用户被视为“在线”的时间量-例如

    <membership defaultProvider="..." 
                userIsOnlineTimeWindow="10" 
      <providers>
        ....
      </providers>
    </membership>
    

    使用Session\u End的另一个问题是它不能可靠地启动,事实上,如果您使用的不是inproc Session state,那么您根本无法依赖它


    一个更好的选择是使用成员资格提供程序,看看

    使用Session\u End的另一个问题是它不能可靠地启动,事实上,如果您使用的不是inproc Session state,那么您根本无法依赖它


    一个更好的选择是使用会员资格提供者,看看你的实现将不是很准确-如果用户使用两个浏览器登录,你的计数器将增加两个


    许多网站只是记录登录次数,然后计算过去x分钟内唯一登录的次数,以获得在线总数。

    您的实现将不太准确-如果用户使用两个浏览器登录,您的计数器将增加两个



    很多网站只是记录登录次数,然后计算最后x分钟内的唯一登录次数,以获得在线总数。

    如果他使用会员资格提供商,这将是最容易使用的一个。如果我使用会员资格提供商,会员资格提供商是否有一个API来获取当前在线用户数?——为什么会员资格提供商更可靠?当终端用户浏览器关闭时,用户的在线数量可能会立即减少?@George2啊,是的,看起来你是对的,只登录-没有意识到你也想统计匿名用户…假设你使用默认的
    AspNetSqlMembershipProvider
    ,每个用户一次,不管浏览器/机器如何,它基于数据库中的每个用户字段工作。如果您使用的是自定义提供程序,这取决于该提供程序是如何实现的……如果他使用会员资格提供程序,这将是最容易使用的。如果我使用会员资格提供程序,会员资格提供程序是否有一个API来获取当前的在线用户?——为什么会员资格提供商更可靠?当终端用户浏览器关闭时,用户的在线数量可能会立即减少?@George2啊,是的,看起来你是对的,只登录-没有意识到你也想统计匿名用户…假设你使用默认的
    AspNetSqlMembershipProvider
    ,每个用户一次,不管浏览器/机器如何,它基于数据库中的每个用户字段工作。如果您使用的是自定义提供程序,这取决于该提供程序如何实现它……为什么成员资格提供程序更可靠?当终端用户浏览器关闭时,在线用户数量可能会立即减少?如果我使用会员资格提供商,会员资格提供商是否有一个API来获取当前在线用户数量?@geoge2,会员资格提供商更可靠,因为它能始终如一地工作,现在它不会立即知道用户离线,但一旦“UserIsOnlineTimeWindow”已过期。用户将不再被视为在线用户。不是即时的,而是一致的。嗨,Chris,你能给我展示一个如何使用会员资格提供商实现在线用户计数功能的示例(例如,示例代码或可用于获取在线用户数的API)?我以前使用过成员资格提供程序,以前只使用过身份验证提供程序功能。@George2,如果您想计算当前联机的唯一访问者的数量,那么我建议您向请求中添加一个cookie,并且只计算cookie一次。您可以创建一个GUID,并将其存储在数据库中,并提供最后一次访问时间来自使用该cookie的用户的y请求将更新数据库中的上次访问时间,如果上次访问时间大于您定义的某个时间,则该用户不再被视为联机。如果记录的时间早于某个定义的时间段,则可以从数据库中清除记录。为什么成员资格提供程序更可靠?当最终用户浏览器如果我使用会员资格提供商,会员资格提供商是否有一个API来获取当前在线用户?@geoge2,会员资格提供商更可靠,因为它将始终如一地工作,现在它不会立即知道用户离线,但一旦“UserIsOnlineTimeWindow”“已过期,用户将不再被视为在线用户。不是即时的,而是一致的。嗨,Chris,你能给我展示一个如何使用会员资格提供商实现在线用户计数功能的示例吗(例如,示例代码或可以使用哪个API在线获取#个用户)?我以前使用过成员资格提供程序,以前只使用过身份验证提供程序功能。@George2,如果您想计算当前在线的唯一访问者的数量,那么我建议您向请求中添加一个cookie,并只计算cookie一次。您可以创建GUID并将其存储在具有上次访问时间的数据库中,来自具有该cookie的用户的每个请求都将更新数据库中的上次访问时间,如果上次访问时间大于您定义的某个时间,则该用户不再计为联机。如果记录的时间早于某个定义的时间段,则可以从数据库中清除这些记录