分析discuz nt2.0的HttpModule.cs文件


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

5publicvoidInit(HttpApplicationcontext)
6{
7OnlineUsers.ResetOnlineList();
8context.BeginRequest+=newEventHandler(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///<paramname="sender">事件的源</param>
5///<paramname="e">包含事件数据的EventArgs</param>
6privatevoidReUrl_BeginRequest(objectsender,EventArgse)
7{
8//获取基本配置信息
9BaseConfigInfobaseconfig=BaseConfigProvider.Instance();
10
11if(baseconfig==null)
12{
13return;
14}

15
16//得到论坛配置信息
17GeneralConfigInfoconfig=GeneralConfigs.GetConfig();
18HttpContextcontext=((HttpApplication)sender).Context;
19stringforumPath=baseconfig.Forumpath.ToLower();
20
21stringrequestPath=context.Request.Path.ToLower();
22
23if(requestPath.StartsWith(forumPath))
24{
25if(requestPath.Substring(forumPath.Length).IndexOf("/")==-1)
26{
27//声明并设置默认论坛模板
28stringstrTemplateid=config.Templateid.ToString();
29//判断COOKIE中模板是否是系统当前的有效(已入库)模板
30if(Utils.InArray(Utils.GetCookie(Utils.GetTemplateCookieName()),
31Templates.GetValidTemplateIDList()))
32{
33strTemplateid=Utils.GetCookie(Utils.GetTemplateCookieName());
34}

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

45else//否则使用聚合首页来做为网站首页并重写路径
46{
47
48context.RewritePath(forumPath+"aspx/"+strTemplateid+"/website.aspx");
49}

50
51return;
52}

53
54
55//当使用伪aspx,如:showforum-1.aspx等.
56if(config.Aspxrewrite==1)
57{
58//获取后台设置的可以使用的伪aspx设置.
59//SiteUrls.GetSiteUrls()类和方法说明见下文
60foreach(SiteUrls.URLRewriteurlinSiteUrls.GetSiteUrls().Urls)
61{
62//进行正则匹配,来看访问页面是否是用户定义的伪URL地址
63if(Regex.IsMatch(requestPath,url.Pattern,Utils.GetRegexCompiledOptions()|RegexOptions.IgnoreCase))
64{
65stringnewUrl=Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")),url.Pattern,url.QueryString,Utils.GetRegexCompiledOptions()|RegexOptions.IgnoreCase);
66
67context.RewritePath(forumPath+"aspx/"+strTemplateid+url.Page,string.Empty,newUrl);
68return;
69}

70}

71}

72
73
74
75context.RewritePath(forumPath+"aspx/"+strTemplateid+requestPath.Substring(context.Request.Path.LastIndexOf("/")),string.Empty,context.Request.QueryString.ToString());
76}

77//当前请求路径是“论坛路径/archiver(简洁版路径)/"下时.
78elseif(requestPath.StartsWith(forumPath+"archiver/"))
79{
80
81
82return;
83}

84//当前请求路径是“论坛路径/tools/(论坛工具页面如:rss,sitemap,help等)”请求时
85elseif(requestPath.StartsWith(forumPath+"tools/"))
86{
87
88return;
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,不过对于搜索引擎来说已经很好了。

优质内容筛选与推荐>>
1、html5实现渐变效果
2、一种平面提取的点云简化算法
3、树状数组 求区间和
4、HDU 1029 Ignatius and the Princess IV
5、滤镜模糊效果,利用了文字阴影和透明。其实是抄的iSlider官网的


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn