最后公司搞了个UBA(用户行为分析)系统,就是想把公司里所有用到的网站的页面、按钮、登录等信息全部收集到了一起,然后进行分析统计。刚好我做的一个网站项目一期已经完工,现在也要弄这东西,看公司以前几个ASP.NET网站做的收集处理,就是在每个页面的PAGELOAD和按钮事件里面都加一行收集代码。我一想几十个页面都要加这个,并且每个事件里面还得加,这真麻烦。
我在想有没有一个好办法,能统一在页面和按钮的某个生命周期上加个事件,或监听每个页面和按钮被访问。本着自己想到的事,可以别人已经做好了的思想去网上转了下,HTTPMODEL、HTTPHANDLE都仔细考虑下,发现有点难。最后无意发现了个好东西http://www.cnblogs.com/fish-li/archive/2012/06/10/2544087.html里介绍了一个pageadapter,它能够处理页面的每个生命周期,再看了作者写的代码,然后在VS里一找发现这个东西的老祖宗是controladapter,也就是说它能对控件都有效果。那这事就超级简单了。
1.写一个类继承pageadapter,重写page_load事件处理第一次访问页面时的记录收集
public class UBAPageAdapter : System.Web.UI.Adapters.PageAdapter { protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (!Page.IsPostBack) { //处理第一页面打开 if (Page.User.Identity != null) { string username = this.Page.User.Identity.Name.ToUpper().Replace("DOMAIN\\", ""); string title = this.Page.Title; try { if ( title.Length > 20) { title = title.Substring(0, 20); } UBAHelper.RecordOperateLog(username, OperateType.Page, title); } catch (Exception ex) { WebLogManager.Log(LogOperation_OpType.System, "UBA系统访问异常"); } } } } }
这里UBAHelper是我们UBA系统信息收集类,WebLogManager是log4net针对我们网站的一个帮助类,在这里就不说了。
2.写一个类继承ControlAdapter处理Button按钮事件,这个按钮事件处理起来有点技巧等下看代码就知道了
public class UbaButtonAdapter : ControlAdapter { protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.Control.Page.IsPostBack) { if (Page.User.Identity != null) { string username = this.Page.User.Identity.Name.ToUpper().Replace("DOMAIN\\", ""); Button btn = this.Control as Button; btn.Click += delegate(object sender, EventArgs ev) { string btntext = btn.Text; string btnid = btn.ID; try { string str = string.Format("显示文本:{0},ID:{1}", btntext, btnid); if (str.Length > 20) { str = str.Substring(0, 20); } UBAHelper.RecordOperateLog(username, OperateType.Button, str); } catch (Exception ex) { WebLogManager.Log(LogOperation_OpType.System, "UBA系统访问异常"); } }; } } } }
这里为了收集按钮事件,就采用了事件注册机制btn.Click += delegate(object sender, EventArgs ev){...}这样只要这个按钮被触发,那这个事件也被触发。
写完这两个就是把这两个类加到App_Browsers\xxx.browser文件里就完了
<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="xxxx.Web.BasePage" adapterType="xxxx.Web.UBAPageAdapter,xxxx.Web" /> <adapter controlType="System.Web.UI.WebControls.Button" adapterType="xxxx.Web.UbaButtonAdapter,xxxx.Web" /> </controlAdapters> </browser> </browsers>
一个是记录全网站的所有继承BasePage的页面行为,一个是记录全网站的Button的行为,登录记录信息我是写在session_start里,如还需记录其它信息,随便改改也应该不难。