为BlogEngine.NET增加点击量显示
我的博客:http://www.intersense.net/zblog.aspx
BlogEngine.NET是相当优秀的博客系统,前段时间一直用,只是最近才由于空间的问题换了,但是之前有一天突然感觉没有博客点击量。这可不行,当时由于刚开始接触这个系统,所以就上网找解决方法。一找不要紧,还真发现有同学解决了,采用的是扩展数据库的方法;但是这种方式不是我喜欢的,我不想更改BlogEngine.NET的主体代码,还好又发现了一个外国同学Mosa的方案,这种方法是通过编写一个BlogEngine的'”Extensions”进行扩展,方法很是优雅,除了简单的显示点击量,这位同学还进一步为该扩展“添砖加瓦”,进行了更多的设置,如IP地址排除(把自己看的不要统计,否则没意思)等,看一下吧。
BlogEngine的扩展其实就是一个位于App_Code\Extensions的cs文件,我们要做的工作就是把我们需要做的编写到该文件中,上传到相应目录。通过这个例子我们可以仔细的观察一下BlogEngine扩展的用法和功能。两个不同的解决方案,我们的同学解决方案固然可用,但是对BlogEngine的了解还是不够,这样修改之后不利于以后的版本升级,而Mosa的方案就充分利用了extension所提供的接口,所以两者给我们的感觉是完全不同的。
接下来我就把Mosa同学的方案简单介绍一下也顺便学习一下BlogEngine的extensions的工作机制。
BlogEngine.NET的扩展都是用来处理预先定义好的BlogEngin事件,诸如saving post(保存帖子时触发的事件)、serving post(浏览贴子时触发的事件)、adding comment(发表评论时触发的事件)等,为帖子添加点击量显示的功能就是在BlogEngine的serving事件发生时,进行相关处理。为该事件添加处理程序的代码如下:
public PostViews() { Post.Serving += new EventHandleer<ServingEventArgs>(OnPostServing); }
当客户端浏览任何博客文章时,Serving事件即被触发,那时上述代码就可以使得OnPostServing函数被调用(.net中的事件处理机制使用的是代理,不知道什么是代理的话,看完这篇博客记得去补课啊。关于代理之一、之二、事件)。
接下来就需要定义OnPostServing()函数了,事件处理函数一般有两个参数,函数原型:
private void OnPostServing(object sender, ServingEventArgs e)
sender是object类型,表示事件的发出者,e是与事件相关的一些属性。该例中的sender是IPublisher类型的对象,代表的是一个Post(一篇博客);e是ServingEventArgs类型,包含博客的相关信息,如内容Body和打开的位置Location。
ServingEventArgs类型的Location和Body属性需要详细了解一下:
Location属性是一个类型为ServingLocation的枚举值,实际上一篇博客在BlogEngine中可能会出现在多个位置,如主页面上(作为博客列表的内容),浏览博客内容时,也可以通过RSS访问博客。本例中只是计算在浏览器中打开单独一篇博客时为该博客的点击量加一,在帖子内容下面和帖子列表中都会出现该计数值。在主页浏览博客列表时,博客的点击量不会增加,所以事件处理程序中需要判断根据此属性判断,访问是从什么地方发来的。
Body属性,是要发送到客户端的博客的内容,我们可以放心地修改此属性而不必担心博客的实际内容会发生变化,(实际上是在博客发送到客户端之前,我们截获PostServing事件,将点击量信息插到博客的内容后面)。这种方式不会对博客的内容进行任何修改,而是通过一个XML文档保存每个帖子的访问量。
PostServing事件处理程序在每当一篇博客被浏览时,它都会从XML文档中取得当前该博客被浏览的次数,将该值加一保存到XML文件中,并显示到该博客内容的尾部。
这个例子实现的原理就如上所示,至于如何读写XML等内容这里就不补充了。将cs文件添加到App_Code\extensions文件夹,XML文件添加到App_Data文件夹,我们的帖子访问量就可以显示出来了。
对这个例子感兴趣的同学们可以下载源文件,自己研究,心得共享啊。