1/// <summary>
 2        /// 实现接口的Init方法
 3        /// </summary>
 4        /// <param name="context"></param>

 5        public void Init(HttpApplication context)
 6        {
 7            OnlineUsers.ResetOnlineList();
 8            context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
 9        }

10
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 中)


1/**//// <summary>
 2        /// 重写Url
 3        /// </summary>
 4  /// <param name="sender">事件的源</param>
 5  /// <param name="e">包含事件数据的 EventArgs</param>
 6  private void ReUrl_BeginRequest(object sender, EventArgs e)
 
7  {
 
8                        //获取基本配置信息
 9   BaseConfigInfo baseconfig = BaseConfigProvider.Instance();
10            
11   if (baseconfig == null)
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))
24   {
25    if (requestPath.Substring(forumPath.Length).IndexOf("/"== -1)
26    {
27     // 声明并设置默认论坛模板
28                   string strTemplateid = config.Templateid.ToString();
29     // 判断COOKIE中模板是否是系统当前的有效(已入库)模板
30                      if (Utils.InArray(Utils.GetCookie(Utils.GetTemplateCookieName()), 
31      Templates.GetValidTemplateIDList()))
32     {
33                           strTemplateid = Utils.GetCookie(Utils.GetTemplateCookieName());
34     }

35
36     //当访问的是首页时
37                      if (requestPath.EndsWith("/index.aspx"))
38                       {
39      //当配置文件中未指定首页时,则将forumindex.aspx做为首页并重写路径
40                           if (config.Indexpage == 0)
41                           {
42                                
43                                context.RewritePath(forumPath + "aspx/" + strTemplateid + "/forumindex.aspx");
44                           }

45                           else //否则使用聚合首页来做为网站首页并重写路径
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)
57                       {
58      //获取后台设置的可以使用的伪aspx设置.
59      //SiteUrls.GetSiteUrls()类和方法说明见下文
60                           foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
61                           {
62       //进行正则匹配,来看访问页面是否是用户定义的伪URL地址
63                                if (Regex.IsMatch(requestPath, url.Pattern, Utils.GetRegexCompiledOptions() | RegexOptions.IgnoreCase))
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/"))
79    {
80                       
81                       
82                       return;
83    }

84     //当前请求路径是“论坛路径/tools/(论坛工具页面如:rss,sitemap,help等)”请求时
85    else if (requestPath.StartsWith(forumPath + "tools/"))
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)  评论(0编辑  收藏  举报