设为首页 收藏本站
查看: 936|回复: 0

[经验分享] (原创)sharepoint form认证下的当前在线用户统计和当日浏览量的统计

[复制链接]

尚未签到

发表于 2015-9-25 08:18:57 | 显示全部楼层 |阅读模式
  解决这个问题之前参考了很多asp.net的方案,但是试了之后一直没有达到我想要的效果,但是还是从中学习到了很多很多的东西。
  所以先把这几篇文章给贴出来:
  http://blog.iyunv.com/zjybushiren88888/archive/2009/09/14/4550541.aspx
  http://www.cnblogs.com/anchenjie007/archive/2008/02/27/1083273.html
  http://blog.iyunv.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文件里插入如下代码:
  

DSC0000.gif DSC0001.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代码如下:
  

代码

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的列表。
  我们需要建立一个显示当前用户在线列表的控件:
  前台代码:

代码

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>  
  
  后台代码:

代码

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["UserID"].ToString();
               SPWeb spst = SPContext.Current.Site.RootWeb;
               try
               {
                   SPUser user = spst.AllUsers["ln:" + uid];
                   string name = user.Name;
                   if (name != null)
                   {
                       dt.Rows["Username"] = name.ToString();
                   }
                   else
                   {
                       dt.Rows["Username"] = "用户";
                   }
               }
               catch
               {
                   dt.Rows["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();
   
        }
      
    }
}  
  
  PS:本人是。net和sharepoint的新手,代码肯定写的不好,写的东西也是大部分借鉴别人的东西再做修改而来的。欢迎大家来拍板砖共同学习共同进步~O(&#8745;_&#8745;)O~
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118378-1-1.html 上篇帖子: 浅谈Sharepoint权限 下篇帖子: SharePoint 2013 代码创建应用程序目录(App Catalog)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表