使用HttpModule实现网址重写和HttpHandler冲突的解决办法
功能描述:
1. 用HttpModule做了一个重写URL的功能,实现所有访问html的请求要经过httpModule处理,如果页面中有对应的aspx页面,就转发到那个页面,如果没有,就转发到原来请求的那个页面。
2. 但后面有做了一个使用HttpHandler是aspx页面静态化的功能,实现访问某一类的页面的时候,如果没有就使用模板创建html页面,如果有,就访问已存在的页面。
3. 做完上面两步,使用html的方式访问aspx页面时没问题,但访问项目中已有的html页面就有问题了,不是html文件夹中的静态化页面不能访问,就是其他html页面无法访问。
对于这个问题,有以下几点应该注意:
1.httpModule页面中:
技能点1:判断是否存在对应的aspx页面。如果存在aspx页面,使用app.Context.RewritePath(newUrl)进行路径重写,这个不会与页面中的session冲突。
技能点2:判断没有aspx页面的html请求页面是否是html静态页面文件夹中的页面。如果不是直接转发到请求的页面,如果是,不进行处理,留给实现页面静态化的HttpHandler进行处理。
代码如下:
public void BeginRequest(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; //app.Response.Write("开始处理请求!"); //4.1 截获请求网址 string url = app.Request.RawUrl; //4.2 判断网址是否符合要求,判断是否进行重发到指定页面 if (url.LastIndexOf(".html") > 0) { string newUrl = url.Substring(0,url.Length-4); //确定存在对应的aspx页面才可以进行URl重写 if (File.Exists(app.Server.MapPath(newUrl + "aspx"))) { //转发到指定页面 app.Server.Transfer(newUrl + "aspx"); } else { //如果没有对应的aspx页面,要再次判断是否为html文件夹下的静态页面 //如果是静态页面的请求,不进行处理,如果不是进行转发 //app.Response.Write(url.LastIndexOf("html/") > 0); if(url.LastIndexOf("html/")<= 0) { app.Server.Transfer(url);//转发请求的网址 } } } }
时间: 2024-10-10 20:45:37