点滴积累,融会贯通

-----喜欢一切有兴趣的东西

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

原文:http://www.mzwu.com/article.asp?id=1906

IHttpModule接口实现类OwnHttpModule:

代码
using System;
using System.Web;
using System.Text.RegularExpressions;
using System.Collections.Generic;

/// <summary>
///IHttpModule接口实现类
/// </summary>
public class OwnHttpModule : IHttpModule
{
    
#region IHttpModule 成员

    
/// <summary>
    
/// 初始化模块,并使其为处理请求做好准备
    
/// </summary>
    
/// <param name="app"></param>
    public void Init(HttpApplication app)
    {
        app.AuthorizeRequest 
+= delegate(object sender, EventArgs e)
        {
            HttpApplication app2 
= (HttpApplication)sender;
            Rewrite(app2.Request.Path, app2);
        };
    }

    
/// <summary>
    
/// 处置由实现 System.Web.IHttpModule 的模块使用的资源(内存除外)
    
/// </summary>
    public void Dispose() { }

    
#endregion

    
#region URL 重写

    
/// <summary>
    
/// URL 重写
    
/// </summary>
    
/// <param name="requestedPath"></param>
    
/// <param name="app"></param>
    protected void Rewrite(string requestedPath,System.Web.HttpApplication app)
    {
        
//这边为方便演示直接往集合添加规则,实际应用可考虑将规则写到配置文件中再读取
        Dictionary<stringstring> rules = new Dictionary<stringstring>();
        rules.Add(
@"^/news/(\w+)\.aspx""/news.aspx?t=$1");
        rules.Add(
@"^/soft/(\w+)\.aspx""/soft.aspx?t=$1");
        rules.Add(
@"^/music/(\w+)\.aspx""/music.aspx?t=$1");

        
foreach (KeyValuePair<stringstring> rule in rules)
        {
            Match match 
= Regex.Match(app.Context.Request.Path, rule.Key, RegexOptions.IgnoreCase);
            
if (match.Success)
            {
                
string sendToUrl = Regex.Replace(app.Context.Request.Path,rule.Key,rule.Value, RegexOptions.IgnoreCase);
                
string path = sendToUrl;//虚拟路径
                string querystring = string.Empty;//查询参数
                if(sendToUrl.IndexOf("?"!= -1)
                {
                    path 
= sendToUrl.Substring(0,sendToUrl.IndexOf("?"));
                    querystring 
= sendToUrl.Substring(sendToUrl.IndexOf("?"+ 1);
                }

                app.Context.RewritePath(path, 
string.Empty, querystring);

                
return;
            }
        }
    }

    
#endregion
}

 

使用非常简单,只需在配置文件web.config的<system.web>节点中加入下边节点即可:

 

<httpModules>
  
<add type="OwnHttpModule" name="URLRewriter" />
</httpModules>

 

说明:Http模块必须是IIS将请求调度给 aspnet_isapi.dll ISAPI 扩展后才能发挥作用,所以要使http://www.mzwu.com/news类似的URL能正确重写,必须保证news文件下有default.aspx文件,其原理是访问该URL时,IIS搜索到默认首页文件default.aspx后才会把请求调度给 aspnet_isapi.dll ISAPI 扩展,Http模块才能发挥作用。

posted on 2010-03-24 15:37  小寒  阅读(323)  评论(1编辑  收藏  举报