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个贴子进行索引更新