williambirkin

恭喜发财!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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)
            
{
                        异常写日志 
                        ......
                     }

                 }



        private void Application_AuthenticateRequest(Object source, EventArgs e)
        
{
                     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 信号以存储该请求状态。

未完修改中.......

posted on 2006-12-21 15:35  williambirkin  阅读(389)  评论(0编辑  收藏  举报