sharepoint form认证下的当前在线用户统计和当日浏览量的统计

本文介绍了一种在SharePoint环境中统计在线用户数量及浏览量的方法。通过创建数据库和存储过程,记录用户的活动,并利用GridView控件展示当前在线用户列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sharepoint form认证下的当前在线用户统计和当日浏览量的统计

解决这个问题之前参考了很多asp.net的方案,但是试了之后一直没有达到我想要的效果,但是还是从中学习到了很多很多的东西。

所以先把这几篇文章给贴出来:

http://blog.youkuaiyun.com/zjybushiren88888/archive/2009/09/14/4550541.aspx

http://www.cnblogs.com/anchenjie007/archive/2008/02/27/1083273.html

http://blog.youkuaiyun.com/cncxz/archive/2005/07/18/427778.aspx

之后在国外的一个哥们的博客发现了两篇文章,感觉就是自己需要的,但是还是有偏差,不过总体思路还是我需要的。

地址是:http://bryantlikes.com/bryantlikes/articles/583.aspx

        http://bryantlikes.com/articles/592.aspx

而我做的思路也是参考这个哥们的,但是这个哥们的代码只是针对sharepoint基本验证模式的。

众所周知,要完全精确计算当前站点的在线用户人数列表的开发度是比较大的,因此这次的方法也只是一个非精确的方案。

下面开始讲我的方案:

在sharepoint数据库下建一个数据库UserOnline:在该数据库里建立table:

查询代码如下:

1
2
3   create table [ Hits ]
4 (
5 Url varchar ( 256 ) NOT NULL ,
6 UserID varchar ( 50 ) NOT NULL ,
7 IP varchar ( 50 ) NOT NULL ,
8 Timestamp datetime NOT NULL
9 )
10   go
11
12   create proc Hit_Add
13 (
14 @Url varchar ( 256 ),
15 @UserID varchar ( 50 ),
16   @IP    varchar ( 50 )
17 )
18   as
19 insert into Hits values
20 ( @Url , @UserID , @IP , getdate ())
21
22   go

然后在你的sharepoint站点下的global文件里插入如下代码:

ContractedBlock.gif ExpandedBlockStart.gif 代码
1   protected void Session_Start(Object sender, EventArgs e)
2         {
3
4             try
5             {
6                 using (SqlConnection cn = new SqlConnection( " 上面你建立的数据库的地址 " ))
7                 {
8                     cn.Open();
9
10                     SqlCommand cmd = new SqlCommand();
11                     cmd.Connection = cn;
12                     cmd.CommandText = " Hit_Add " ;
13                     cmd.CommandType = CommandType.StoredProcedure;
14
15                     HttpContext ctx = HttpContext.Current;
16
17                     cmd.Parameters.Add( " @Url " , SqlDbType.VarChar, 256 ).Value = ctx.Request.Url.ToString();
18                     cmd.Parameters.Add( " @UserID " , SqlDbType.VarChar, 50 ).Value = ctx.User.Identity.Name;
19                     cmd.Parameters.Add( " @IP " , SqlDbType.VarChar, 50 ).Value = ctx.Request.UserHostAddress.ToString();
20
21                     cmd.ExecuteNonQuery();
22
23                     cn.Close();
24                 }
25             }
26             catch (SqlException)
27             {
28                             }
29          
30         }
31  

这里要解释一下为什么要在Session_Start事件里执行该事件而不是在Application_AuthenticateRequest事件里执行:

因为在form认证的时候,当你进入登陆页面的时候,系统认为你是以匿名身份登陆的,所以你会发现,当你页面还没有打开的时候,Application_AuthenticateRequest事件已经执行了。

接下来在你的UserOnline数据库再添加一个table代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 代码
1 create table ActiveUsers
2 ( UserID varchar ( 50 ) not null ,
3   IP varchar ( 50 ) not null ,
4   LastHit datetime not null ,
5   LastUrl varchar ( 256 ) not null ,
6   constraint PK_ActiveSessions
7    primary key clustered ( UserID ) )
8   go
9
10
11   alter proc Hit_Add ( @Url varchar ( 256 ), @UserID varchar ( 50 ), @IP varchar ( 50 ))
12   as
13
14   if ( @UserID = ' 域名\系统管理员账号 ' )
15   return
16
17 insert into Hits values
18 ( @Url , @UserID , @IP , getdate ())
19
20 delete ActiveUsers where UserID = @UserID or
21 datediff (mi, LastHit, getdate ()) > 30 -- minutes
22
23 insert into ActiveUsers values
24 ( @UserID , @IP , getdate (), @Url )
25
26
27 go
28
29
30 create proc ActiveUsers_Get
31 as
32 select UserID, LastHit, LastUrl,
33 datediff (mi, LastHit, getdate ()) Age
34 from ActiveUsers
35 go

这样你会发现在你的数据库的可编程性里会多了2个存储过程

一个是Hit_Add一个是ActiveUsers_Get

这样其实整个过程就完成了。在hits表里存的就是点击改站点的所有用户的数据情况,其中信息由 用户名,ip地址和登录时间。我们可以通过不同的select语句来获得当月当日或者总的 用户登录数

1 select count ( * ) num from [ UserOnline ] . [ dbo ] . [ Hits ]
2 where    datediff ( day , timestamp , getdate ()) = 0

上面的代码就是获得当天的用户登录数的语句

而在ActiveUsers_Get里你也许也会发现几条用户的数据,但是其实那并不是我要的真正的activeusers的列表。

我们需要建立一个显示当前用户在线列表的控件:

前台代码:

ContractedBlock.gif ExpandedBlockStart.gif 代码
1 < asp:GridView ID = " GridOnline " runat = " server " CssClass = " myEailList "
2     Width = " 100% "   border = " 0 " cellpadding = " 0 " cellspacing = " 0 "
3     AlternatingRowStyle - CssClass = " tr1 " AllowPaging = " True "
4     onpageindexchanging = " GridOnline_PageIndexChanging " PageSize = " 50 " >
5      < PagerSettings Mode = " NumericFirstLast " />
6 < AlternatingRowStyle CssClass = " tr1 " ></ AlternatingRowStyle >
7 </ asp:GridView >
8 < asp:Label ID = " erInfo " runat = " server " ></ asp:Label >

后台代码:

ContractedBlock.gif ExpandedBlockStart.gif 代码
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Data.SqlClient;
using Microsoft.SharePoint.Utilities;
using Ultrapower.Portal.Business;


namespace Ultrapower.Portal.UserControls
{
   
public partial class UserOnLine : System.Web.UI.UserControl
    {
       
private   void dowithgrd( string keyword, string name)
        {

            BoundField sendTimeField
= new BoundField();
            sendTimeField.DataField
= keyword;

            sendTimeField.HeaderText
= name;
            GridOnline.Columns.Add(sendTimeField);

        }

   
      
private   DataSet ds = new DataSet();
      
private DataTable dt = new DataTable();

      
protected void Page_Load( object sender, EventArgs e)
       {


           UserOnlineCollection useronlineclt
= new UserOnlineCollection();
          
string sqlcmd = " ActiveUsers_Get " ;


           ds
= useronlineclt.GetActiveUserTable(sqlcmd, CommandType.StoredProcedure);
           GridOnline.Columns.Clear();
           dowithgrd(
" Username " , " 名称 " );
           dowithgrd(
" UserID " , " 登录名 " );
           dowithgrd(
" IP " , " 登录IP " );
           dowithgrd(
" LastHit " , " 登录时间 " );
           GridOnline.AutoGenerateColumns
= false ;
           dt
= ds.Tables[ 0 ];
           dt.Columns.Add(
" Username " );
          
for ( int i = 0 ; i < dt.Rows.Count; i ++ )
           {




              
string uid = dt.Rows[i][ " UserID " ].ToString();

               SPWeb spst
= SPContext.Current.Site.RootWeb;
              
try
               {
                   SPUser user
= spst.AllUsers[ " ln: " + uid];
                  
string name = user.Name;
                  
if (name != null )
                   {
                       dt.Rows[i][
" Username " ] = name.ToString();
                   }
                  
else
                   {
                       dt.Rows[i][
" Username " ] = " 用户 " ;
                   }

               }
              
catch
               {
                   dt.Rows[i][
" Username " ] = " 用户 " ;
               }
           }
         

           GridOnline.DataSource
= ds.Tables[ 0 ];

           GridOnline.DataBind();

       }

       
protected void GridOnline_PageIndexChanging( object sender, GridViewPageEventArgs e)
        {

            GridOnline.PageIndex
= e.NewPageIndex;

            GridOnline.DataSource
= ds.Tables[ 0 ];

            GridOnline.DataBind();
   
        }

      
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值