本人是asp.net爱好者,是一个初学者,做个几个小程序,但都拿不出手,基本没什么设计思想可言,最近想系统的学习一下,于是选择了分析discuznt来学习。这一次先分析一下HttpModule.cs
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
2
/// 实现接口的Init方法
3
/// </summary>
4
/// <param name="context"></param>
5
public void Init(HttpApplication context)
6![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
7
OnlineUsers.ResetOnlineList();
8
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
9
}
10![](/Images/OutliningIndicators/None.gif)
1、上面代码中的Init(HttpApplication context)是HttpModule类进行操作的入口,所有实现System.Web.IHttpModule 接口的类都必须实现这个函数。
2、void(C# 参考)
用作方法的返回类型时,void 关键字指定方法不返回值。
在方法的参数列表中不允许使用 void。采用以下形式声明一个无参数的、不返回值的方法:
void SampleMethod();
2、OnlineUsers.ResetOnlineList()方法主要是用于“重置(复位)在线表”,
3
、 因为当获取URL请求时,IIS都会接管请求进行相应的操作(详见DUDU的文章:" ASP.NET 2.0运行时
简要分析")后,最终通过Web.config中的相应配置节来执行用户预定的处理操作。而我们的代码就在ReUrl_BeginRequest事件中
HttpModule类就是处理URLs重写的类,继承IHttpHandler接口,实现该接口的两个方法,Init和Dispose。在Init方法里注册自己定义的方法,如上例所示:
content.BeginRequest +=new EventHandler(content_BeginRequest);
BeginRequest是一个事件,在收到新的Http请求时触发,将该事件委托给content_BeginRequest方法触发处理。另外说明一点,HttpModules能注册的方法还有很多,如:EndRequest、Error、Disposed、PreSendRequestContent等等。
EventHandler 委托
表示将处理不包含事件数据的事件的方法。
命名空间:System
程序集:mscorlib(在 mscorlib.dll 中)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1/**//**//**//// <summary>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
2 /**//// 重写Url
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3 /**//// </summary>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
4 /**//// <param name="sender">事件的源</param>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5 /**//// <param name="e">包含事件数据的 EventArgs</param>
6 private void ReUrl_BeginRequest(object sender, EventArgs e)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
{
8 //获取基本配置信息
9 BaseConfigInfo baseconfig = BaseConfigProvider.Instance();
10
11 if (baseconfig == null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
12
{
13 return;
14 }
15
16 //得到论坛配置信息
17 GeneralConfigInfo config = GeneralConfigs.GetConfig();
18 HttpContext context = ((HttpApplication)sender).Context;
19 string forumPath = baseconfig.Forumpath.ToLower();
20
21 string requestPath = context.Request.Path.ToLower();
22
23 if (requestPath.StartsWith(forumPath))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
{
25 if (requestPath.Substring(forumPath.Length).IndexOf("/") == -1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
{
27 // 声明并设置默认论坛模板
28 string strTemplateid = config.Templateid.ToString();
29 // 判断COOKIE中模板是否是系统当前的有效(已入库)模板
30 if (Utils.InArray(Utils.GetCookie(Utils.GetTemplateCookieName()),
31 Templates.GetValidTemplateIDList()))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
32
{
33 strTemplateid = Utils.GetCookie(Utils.GetTemplateCookieName());
34 }
35
36 //当访问的是首页时
37 if (requestPath.EndsWith("/index.aspx"))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
38
{
39 //当配置文件中未指定首页时,则将forumindex.aspx做为首页并重写路径
40 if (config.Indexpage == 0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
41
{
42
43 context.RewritePath(forumPath + "aspx/" + strTemplateid + "/forumindex.aspx");
44 }
45 else //否则使用聚合首页来做为网站首页并重写路径
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
46
{
47
48 context.RewritePath(forumPath + "aspx/" + strTemplateid + "/website.aspx");
49 }
50
51 return;
52 }
53
54
55 //当使用伪aspx, 如:showforum-1.aspx等.
56 if (config.Aspxrewrite == 1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
57
{
58 //获取后台设置的可以使用的伪aspx设置.
59 //SiteUrls.GetSiteUrls()类和方法说明见下文
60 foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
{
62 //进行正则匹配,来看访问页面是否是用户定义的伪URL地址
63 if (Regex.IsMatch(requestPath, url.Pattern, Utils.GetRegexCompiledOptions() | RegexOptions.IgnoreCase))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
64
{
65 string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")), url.Pattern, url.QueryString, Utils.GetRegexCompiledOptions() | RegexOptions.IgnoreCase);
66
67 context.RewritePath(forumPath + "aspx/" + strTemplateid + url.Page, string.Empty, newUrl);
68 return;
69 }
70 }
71 }
72
73
74
75 context.RewritePath(forumPath + "aspx/" + strTemplateid + requestPath.Substring(context.Request.Path.LastIndexOf("/")), string.Empty, context.Request.QueryString.ToString());
76 }
77 //当前请求路径是“论坛路径/archiver(简洁版路径)/"下时.
78 else if (requestPath.StartsWith(forumPath + "archiver/"))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
79
{
80
81
82 return;
83 }
84 //当前请求路径是“论坛路径/tools/(论坛工具页面如:rss,sitemap,help等)”请求时
85 else if (requestPath.StartsWith(forumPath + "tools/"))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
86
{
87
88 return;
89 }
90
91 }
92 }
93
94
1、
委托类型 EventHandler 在它的调用签名中定义了两个参数。第一个参数(名为 sender)是基于通用 Object 类型的。sender 参数用于传递指向事件源对象的引用。例如,当 Button 对象引发基于 EventHandler 委托类型的事件时,作为事件源的它将传递一个对自身的引用。此处的引用就是BeginRequest.
由 EventHandler 定义的第二个参数名为 e,它是 EventArgs 类型的对象。在许多情况下,事件源传递的参数值等于 EventArgs.Empty,这表明没有额外参数信息。如果事件源希望在 e 参数中传递额外的参数化信息,则它应该传递一个从 EventArgs 类的派生类创建的对象。
例子:
[code]
private void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
// 获取旧的Url
string url = context.Request.Path.ToLower();
// 重新生成新的Url
string newUrl = “123.aspx”; // 这里改下
// 重写Url
context.RewritePath(newUrl);
}
[/code]
context.Request.Path.ToLower(); 是取得URL中http://之后第一个“/”之后所有的字符串。也就是虚拟目录。ToLower是转为小写形式。
这样一来,只要我们访问了网站的任何页面,如1.aspx,其实是访问123.aspx,无伦1.aspx中有啥玩意一律不运行,因为就此例子中我们没有对URL进行任何判断。
还有就是,如果你在 这个类文件中 write Request.Path.ToLower 和在123.aspx中writ Request.Path.ToLower 其是完全不一样的,也就是说开发的时候就想着当前路径开发行了。
最后,再最后声明下,单纯的用web.config来实现URL重写,其后缀名转来转去还是只能是aspx,不过对于搜索引擎来说已经很好了。
posted on
2008-04-15 17:01
小楼听风雨
阅读(
542)
评论()
编辑
收藏
举报