asp.net forums中的UrlRewrite拾锦

一开始,当然从HttpModule开始,就是类ForumsHttpModule

(不能忽略ForumConfiguration.cs这个常用文件,里面的代码比较简单,就不说了)

-->Init()函数,其中挂钩事件到application上,再定义了两个timer定时器,每15分钟一次

-->根据application事件的先后顺序,首先是Application_BeginRequest()

-->其中调用了RewriteUrl()函数

-->再调用Globals.GetSiteUrls();(中间过渡)

-->再调用SiteUrls:SiteUrls();读取SiteUrls.config文件,即URL的变换规则

-->返回后,才开始真正的重写工作,代码全在ReWrittenUrl.cs文件

     熟悉的人其实一看SiteUrls.config就知道怎样操作了,因为没有像dottext那样太类化,只是命名有点乱

~~~~~~~~~~~~~不过不要忽略这一小段代码

    ForumContext frmContext = CreateForumContext(context);
    frmContext.CurrentUrl = context.Request.RawUrl.ToString();

    // 2005/04/07
    //safe to set url rewrite data;
    if(isReWritten && newPath != null)
    {
     frmContext.IsUrlReWritten = true;
    }

还有就是web.config里的<pages validateRequest="false" autoEventWireup="true" pageBaseType="AspNetForums.Components.ForumPage, AspNetForums.Components" />

其中类ForumPage扩展自page类,实现为改写action属性为变更后的url,这是asp.net自添加的属性,用于自post

~~~~~~~~~~~~~~~~~~~~~~~~~~~

-->接下看还有一个重要的函数是CaptureForumPingback()

     其实现RSS订阅,注意不是帖子的订阅,而是每个版块右上角的RSS订阅

-->其中ForumsDataProvider dp = ForumsDataProvider.Instance();返回的其实是SqlDataProvider类

     下面那句dp.RssPingback(pingbackList);调用储存过程forums_Forum_RssPingback_Update更新表forums_ForumPingback记录

     这里的功能似乎只是更新RSS订阅的次数就了事了

-------------------------------------------------

按时间顺序,接着是Application_AuthenticateRequest()

-->其中判断验证方式,如为passport/negotiate可见下载包附带的“Itelite Passport使用说明”

-->最后,无论哪种验证模式,都在roles.GetUserRoles()里context.User = new GenericPrincipal(context.User.Identity, roleArray );

-------------------------------------------------

接着是Application_AuthorizeRequest(),跟踪匿名用户(这部分没有细看,单从两三个函数还搞不清来龙去脉),并判断用户有否访问页面的权限,没有转向登出页面

-------------------------------------------------

接着,在离开HttpModule之前,再回过头来看两个定时器实现的功能

-->emailTimer挂载ScheduledWorkCallbackEmailInterval(),实现 邮件发送/匿名在线更新

-->Emails.SendQueuedEmails( (HttpContext) sender);

     将邮件暂存于数据库,然后用定时器实现邮件群发,是一种常用技术。这里把类MailMessage派生一个新类EmailTemplate,实现记录发送失败次数的做法,值得借鉴;还有一点就是用fields属性实现SMTP服务器的用户验证

-->statsTimer挂载ScheduledWorkCallbackStatsInterval(),实现 索引和统计信息

-->其中Search.IndexPosts( (HttpContext) sender, 100);

     ANF的模拟全文搜索就从这里出发,其过程原理hidotnet已有详细论述,实现为每过15分钟对最新的100个贴子进行索引更新

 

 

 

posted on 2005-12-26 22:18  lwj  阅读(385)  评论(0编辑  收藏  举报