BlogEngine.NET-博易

博易,简易而不简单。致力于打造专业博客!

博易(BlogYi v1.0)的插件扩展机制

By

博易向您提供这篇文章是建立在您已经对ASP.NET中的概念有比较深入了解的基础之上的。您可能需要了解.NET的委托、事件等概念。

博易给插件的扩展提供了两种主要的事件接口。Post.Serving事件是与调用文章相关的事件接口;Post.CommentServing事件是与调用评论相关的事件接口。订阅这两个事件可以在调用文章和调用评论时调用您编写的程序代码。这个调用与系统的钩子(Hook)相似。完成一个完整的插件扩展只需要4个步骤!

下面以开发一个防图片盗链的插件扩展为例说明。

第一步:
按照如下形式构造一个类,之所以要规定形式,是为了便于插件管理系统统一管理。

[code:c#]
[Extension("防止本站图片显示在其他网站之上")]
public class StopLeechers
[/code]

第二步:
为这个类创建一个无参构造函数,这个函数将在整个系统启动时被调用。

[code:c#]
public StopLeechers()
{
  ImageHandler.BeforeServing += new EventHandler<ImageHandler.FileHandlerEventArgs>(StopReferrers);
}
[/code]

第三步:
现在,我们已经订阅了事件。下面则需要实现该事件的逻辑,也就是您希望添加的代码。

[code:c#]
void StopReferrers(object sender, ImageHandler.FileHandlerEventArgs e)
{
  HttpContext context = HttpContext.Current;
  if (context.Request.UrlReferrer != null)
  {
    if (context.Request.UrlReferrer.Host != context.Request.Url.Host)
    {
      context.Response.StatusCode = 403;
      context.Response.End();
    }
  }
}
[/code]

以上代码的作用是检查URL请求是否来自本地主机,如果不是则返回一个403号错误请求并中止请求。

第四步:
最后要做的就是将经过上面步骤所完成的类放到App_Code目录下。系统将自动激活并启用该类!

此外,博易还提供了如下事件接口:
ImageHandler.BeforeServing – 调用图片前触发
ImageHandler.ImageServing – 调用图片中触发
ImageHandler.BadRequest – 错误请求图片时触发
FileHandler.BeforeServing – 调用文件前触发
FileHandler.FileServing – 调用文件中触发
FileHandler.BadRequest – 错误请求文件时触发
Post.Saved – 保存文章时触发
Post.Rated – 对文章评级时触发
Post.BeforeAddingComment – 发表评论前触发
Post.CommentAdded – 发表评论时触发
Post.BeforeRemovingComment – 删除评论前触发
Post.CommentRemoved – 删除评论时触发
Post.Serving – 调用文章时触发
Post.CommentServing – 调用评论是触发
Page.Saved – 保存页面时触发
BlogSettings.Changed – 更改博客设置时触发
CategoryDictionary.Saved – 分类保存时触发

另附以上示例完整源代码。StopLeechers.zip (741.00 bytes)

2 Comments

  1. July 16, 2008 at 9:23 am

    Cool !
    A good project.

  2. verycool
    January 26, 2010 at 9:56 pm

    thanks very much

Leave a Reply