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语句来获得当月当日或者总的 用户登录数
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