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

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

 

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

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

http://blog.csdn.net/zjybushiren88888/archive/2009/09/14/4550541.aspx

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

http://blog.csdn.net/cncxz/archive/2005/07/18/427778.aspx

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

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

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

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

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

下面开始讲我的方案:

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

查询代码如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 
 
  create table [Hits] 
 (
 Url varchar(256) NOT NULL,
 UserID varchar(50) NOT NULL,
 IP varchar(50) NOT NULL,
 Timestamp datetime NOT NULL 
 )
  go
 
  create proc Hit_Add
 (
 @Url varchar(256),
 @UserID varchar(50),
  @IP   varchar(50)
 )
  as
 insert into Hits values
 (@Url, @UserID, @IP,getdate())
 
  go

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

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1   protected void Session_Start(Object sender, EventArgs e)
         {
 
             try
             {
                 using (SqlConnection cn = new SqlConnection("上面你建立的数据库的地址"))
                 {
                     cn.Open();
 
                     SqlCommand cmd = new SqlCommand();
                     cmd.Connection = cn;
                     cmd.CommandText = "Hit_Add";
                     cmd.CommandType = CommandType.StoredProcedure;
 
                     HttpContext ctx = HttpContext.Current;
 
                     cmd.Parameters.Add("@Url", SqlDbType.VarChar, 256).Value = ctx.Request.Url.ToString();
                     cmd.Parameters.Add("@UserID", SqlDbType.VarChar, 50).Value = ctx.User.Identity.Name;
                     cmd.Parameters.Add("@IP", SqlDbType.VarChar, 50).Value = ctx.Request.UserHostAddress.ToString();
 
                     cmd.ExecuteNonQuery();
 
                     cn.Close();
                 }
             }
             catch (SqlException)
             {
                             }
           
         }

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

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

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

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 create table ActiveUsers 
 ( UserID varchar(50) not null, 
   IP varchar(50) not null,
   LastHit datetime not null, 
   LastUrl varchar(256) not null, 
   constraint PK_ActiveSessions 
    primary key clustered ( UserID ) ) 
  go 
 
 
  alter proc Hit_Add (@Url varchar(256), @UserID varchar(50),@IP varchar(50)) 
  as 
 
  if (@UserID = '域名\系统管理员账号') 
  return 
 
 insert into Hits values 
 (@Url, @UserID,@IP,getdate()) 
 
 delete ActiveUsers where UserID = @UserID or 
 datediff(mi, LastHit, getdate()) > 30 -- minutes 
 
 insert into ActiveUsers values 
 (@UserID, @IP,getdate(),@Url) 
 
 
 go 
 
 
 create proc ActiveUsers_Get 
 as 
 select UserID, LastHit, LastUrl, 
 datediff(mi, LastHit, getdate()) Age 
 from ActiveUsers
 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的列表。

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

前台代码:

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 <asp:GridView ID="GridOnline" runat="server" CssClass="myEailList" 
     Width="100%"  border="0" cellpadding="0" cellspacing="0" 
     AlternatingRowStyle-CssClass="tr1" AllowPaging="True" 
     onpageindexchanging="GridOnline_PageIndexChanging" PageSize="50">
      <PagerSettings Mode="NumericFirstLast" />
 <AlternatingRowStyle CssClass="tr1"></AlternatingRowStyle>
 </asp:GridView>
 <asp:Label ID="erInfo" runat="server" ></asp:Label>

后台代码:

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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();
    
        }

       
    }
}

转载:http://www.cnblogs.com/mybi/archive/2011/04/14/2016071.html

转载于:https://www.cnblogs.com/EricLee007/archive/2012/06/25/2560941.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值