在.net中的global.asax中有Application_AuthenticateRequest事件和Application_BeginRequest事件是在每次访问aspx文件都会触发。但是Application_BeginRequest中不能对已经经过FROMS身份验证的身份ticket票进行识别。所以只能放到Application_AuthenticateRequest中去。
我的实现原理是:每次访问aspx文件时候都会判断在线表里面是否有这个用户(已经登录了的记录用户名,没有登录的记录IP地址),如果不存在,则将该用户的身份、最后访问时间、最后访问IP、和最后访问的URL存入数据库。如果数据库中已经曾在,则更新该记录,把最后访问时间,IP以及最后访问URL更新。
     各位高手帮帮忙,小女子先谢过了!

解决方案 »

  1.   

    在先人数统计
    <%@ Page Language="c#" debug="true" %>
    <html>
    <head>
    <SCRIPT LANGUAGE="c#" RUNAT="server">
    private void Page_Load(object sender, System.EventArgs e)

    Visitors.Text = "本站当前有: <b>" + Application["user_sessions"].ToString() + "" + "</b> 位访问者 !";
    }
    <title>在线用户</title>
    </head>
    <body>
    <asp:label id="visitors" runat="server" /><br>
    </body>
    </html> global.asax文件:
    <script language="c#" runat="Server">
    protected void Application_Start(Object sender, EventArgs e)
    {
    Application["user_sessions"] = 0;
    }
    protected void Session_Start(Object sender, EventArgs e)
    {
    Application.Lock();
    Application["user_sessions"] = (int)Application["user_sessions"] + 1;
    Application.Unlock();
    }
    protected void Session_End(Object sender, EventArgs e)
    {
    Application.Lock();
    Application["user_sessions"] = (int)Application["user_sessions"] - 1;
    Application.Unlock();
    }
    </script> 另外建议为什么不在Session_Start里面更新最后登录时间呢?是因为验证特殊需要么?
      

  2.   

    写一个更新数据库的函数,然后在Application_AuthenticateRequest里调用不就行了?
      

  3.   

    ... 怎么这么像我在公司考别人的题目?......楼主你的实现原理已经比较OK的了
    不过最好与用户登录验证方法结合一起, 登录的时候将用户的profile保存在全局变量里, 例如在asp.net 2.0里就保存在profile里.在Application_AuthenticateRequest的时候可以根据登记了的profile进行判断而进行更新数据库, 要注意一些地方, 比如是判断Request.Method, 如果是POST的就不执行计数, 因为总不能用户点击了submit button也要计一下数吧.
      

  4.   

    此女子的解决办法可行,可是如果一个人拨号上网,没有固定的ip,那么如果session内容不作更新的话,会出现多个用户一个ip,或者不可预知
      

  5.   

    创建一个自己的Page类,将页面继承你的Page类,将要实现的验证写在你自己的Page类中。
      

  6.   

    闷!郁闷!CSDN变味了,越来越像BBS了.
      

  7.   

    因为CSDN人妖太多,所以就算真出来个MM,大伙也不信了
    怪你动不动就搬出来“小女子”这样标题
    说实在的,我也很烦这一类标题
      

  8.   

    其实统计在线人数的问题可以分两步走,一个是登录过的一个是没登录过的.这两种情况都是在一个会话(session)里发生的事情.我的做法是上来后就把IP地址记录到零时表1,记录SessionID和IP.如果之后用户登陆了.则再记录下用户名.session有失效期,这样也容易去除非正常退出的用户.我觉得不要把登录方式什么都考虑进去,这样问题容易复杂化.
      

  9.   

    Request.UserHostAddress.ToString();
    早点结贴吧,我这里显示?号。