ForumsHttpModule
事件/方法 |
目的/功能 |
Init应用程序初始化方法 |
注册HttpApplication事件 加载系统配置数据。web.config的<system.web>下<forums>节点。 创建定时器:更新论坛统计信息;定时索引指定条数的帖子;定时群发队列中的邮件。 |
Dispose 方法 |
释放资源 |
Application_BeginRequest 事件 |
实现url的重写。 其实现RSS订阅。 论坛程序访问控制:论坛程序是否允许远程访问。 |
Application_AuthenticateRequest 事件 |
获得用户标识和角色信息。 |
Application_AuthorizeRequest 事件 |
跟踪匿名用户,判断是否跳转到登录页。 |
Application_OnError 事件 |
异常处理 |
CreateForumContext 方法 |
创建上下文对象并保存到上下文中 |
RewriteUrl 方法 |
实现url的重写 |
ScheduledWorkCallbackEmailInterval 方法 |
邮件发处理 |
ScheduledWorkCallbackStatsInterval 方法 |
论坛信息处理 |
CaptureForumPingback 方法 |
其实现RSS订阅 |
代码分析
public void Init(HttpApplication application)
{
// 注册HttpApplication事件
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
application.AuthenticateRequest += new EventHandler(Application_AuthenticateRequest);
application.Error += new EventHandler(this.Application_OnError);
application.AuthorizeRequest += new EventHandler(this.Application_AuthorizeRequest);
#if DEBUG
application.ReleaseRequestState += new EventHandler(this.Application_ReleaseRequestState);
#endif
//加载系统配置web.config的<system.web>下<forums>节点。
//关于web.config的介绍请参考ANForums 学习2- web.config文件详解(http://www.cnblogs.com/williambirkin/archive/2006/12/06/582113.html)
ForumConfiguration forumConfig = ForumConfiguration.GetConfig();
//定时器
if (forumConfig != null && forumConfig.IsBackgroundThreadingDisabled == false)
{
if (emailTimer == null)
emailTimer = new Timer(new TimerCallback(ScheduledWorkCallbackEmailInterval), application.Context, EmailInterval, EmailInterval);
if (forumConfig.IsIndexingDisabled == false
&& statsTimer == null)
{
statsTimer = new Timer(new TimerCallback(ScheduledWorkCallbackStatsInterval), application.Context, StatsInterval, StatsInterval);
}
}
}
public void Dispose()
private void Application_BeginRequest(Object source, EventArgs e)
{
try
{
*************实现url的重写*************
......
bool isReWritten = RewriteUrl(path, query, out newPath);
if (isReWritten && newPath != null)
context.RewritePath(newPath);
ForumContext frmContext = CreateForumContext(context);
frmContext.CurrentUrl = context.Request.RawUrl.ToString();
if (isReWritten && newPath != null)
{
frmContext.IsUrlReWritten = true;
}
*************实现url的重写*************
其实现RSS订阅
CaptureForumPingback();
论坛程序是否允许远程访问。不允许时输出错误页。
if ((Globals.GetSiteSettings().ForumsDisabled) && (HttpContext.Current.Request.Url.Host != "localhost"))
{
......
}
}
catch (Exception ex)
{
异常写日志
......
}
}
{
AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。
......
Application_AuthenticateRequest事件初始化一个context的Identity,其实CS提供了很多的Identity支持,包括Microsoft passport,但是目前的版本中使用的是默认值System.Web.Security.FormsIdentity。
......
获得用户角色信息
......
}
ForumsHttpModule中的其余代码比较简单这里就省略。
附注
1.HttpApplication.BeginRequest 事件
在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
BeginRequest 事件发出信号表示创建任何给定的新请求。此事件始终被引发,并且始终是请求处理期间发生的第一个事件。
2.HttpApplication.AuthenticateRequest 事件
AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订 AuthenticateRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。
3.HttpApplication.AuthorizeRequest 事件
当安全模块已验证用户授权时发生。 AuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。
4.HttpApplication.Error 事件
当引发未处理的异常时发生。 引发 Error 事件的异常可以通过对 GetLastError 方法的调用来访问。如果应用程序生成自定义错误输出,请通过调用 ClearError 方法来取消由 ASP.NET 生成的默认错误信息。
4.HttpApplication.ReleaseRequestState 事件
在 ASP.NET 执行完所有请求事件处理程序后发生。该事件将使状态模块保存当前状态数据。引发 ReleaseRequestState 事件以后,应用程序以该请求结束,并发出 ASP.NET 信号以存储该请求状态。
未完修改中.......