基于asp.net MyHttpModule url重写方法

 代码如下 复制代码

using System;
using System.Collections.Generic;
using System.Web;
using System.IO;
using System.Text;
namespace MyClass
{
public class MyHttpModule : IHttpModule
{
#region IHttpModule 成员
///<summary>
/// 释放所有资源
///</summary>
public void Dispose()
{
}
///<summary>
/// 初始化模块,并使其为处理请求做好准备
///</summary>
///<param name="context"> 一个 System.Web.HttpApplication,它提供对 ASP.NET 应用程序内所有应用程序对象的公用的方法、属性和事件的访问</param>
public void Init(HttpApplication context)
{
context.AuthorizeRequest += new
EventHandler(this.BaseModuleRewriter_AuthorizeRequest);
}
///<summary>
/// 当安全模块已验证用户授权时发生
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected virtual void BaseModuleRewriter_AuthorizeRequest(
object sender, EventArgs e)
{
System.Web.HttpApplication app = (System.Web.HttpApplication)sender;
Rewrite(app.Request.Path, app);
}
///<summary>
/// 重写url
///</summary>
///<param name="requestedPath">url的虚拟路径</param>
///<param name="app"></param>
protected void Rewrite(string requestedPath, System.Web.HttpApplication app)
{
List<string> qeryString;
string virtualPath;
string inputFile = GetInputFile(app.Context, out virtualPath, out qeryString);//获取到真实的文件信息
if (System.IO.Path.GetExtension(inputFile) == ".aspx")//如果是aspx文件 那么则把保留重写的url
{
app.Context.RewritePath(requestedPath, string.Empty, string.Empty);//这里查询参数我没去处理了,也就是Request.QueryString的信息,如果取qeryString 然后去处理成一个字符串
return;
}
app.Context.RewritePath(virtualPath, string.Empty, app.Context.Request.QueryString.ToString());//其它文件则使用找到的路径
}
///<summary>
/// 获取url对应的绝对路径和虚拟路径及查询参数
///</summary>
///<param name="context"></param>
///<param name="virtualPath">虚拟路径</param>
///<param name="qeryString">查询参数 如果为null请取HttpContext.Request.QueryString</param>
///<returns>url对应的绝对路径</returns>
public static string GetInputFile(HttpContext context, out string virtualPath, out List<string> qeryString)
{
string executionFilePath = context.Request.AppRelativeCurrentExecutionFilePath.Remove(0, 2);//获取当前对应的虚拟路径并干掉“~/”
string inputFile = context.Request.PhysicalPath;//获取当前url对于的绝对路径
virtualPath = context.Request.AppRelativeCurrentExecutionFilePath;
qeryString = null;
List<string> qeryList = new List<string>();
if (!File.Exists(inputFile))//判断文件是否存在,也就是没有被重写的url获取使用绝对路径的资源等等
{
bool b = false;
string fileName;
string extension;
string applicationPath = context.Request.PhysicalApplicationPath;//获取网站的跟目录
var tempPath = GetFileInfo(inputFile, out fileName, out extension);
while (!b)//根据目录循环获取有效的文件目录
{
b = File.Exists(tempPath + "\" + extension);//判断文件是否存在
if (tempPath + "\" == applicationPath)//如果查找到根目录还没有查找到那么则不需要在查了
{
break;
}
if (!string.IsNullOrWhiteSpace(fileName))
{
qeryList.Add(fileName);//如果不存在那么这个就是参数 例如http://localhost:4688/WebForm1/2011/ (对应http://localhost:4688/WebForm1.aspx?xxx=2011)
}
tempPath = GetFileInfo(tempPath, out fileName, out extension);
}
if (b)//如果查找到了就把查找到的路径复制给输出或返回参数
{
inputFile = tempPath + "\" + extension;
virtualPath = "~/" + inputFile.Replace(applicationPath, null);
}
if (Path.GetExtension(extension) == ".aspx")//如果是asp.net那么则把list复制给输出参数 qeryString
{
qeryString = qeryList;
}
}
return inputFile;
}
///<summary>
/// 获取指定目录+文件是否有效
///</summary>
///<param name="inputFile">目录</param>
///<param name="fileName"></param>
///<param name="extension"></param>
///<returns></returns>
private static string GetFileInfo(string inputFile, out string fileName, out string extension)
{
var tempPath = Directory.GetParent(inputFile).FullName;//获取传进来目录的父目录
fileName = inputFile.Replace(tempPath + "\", null);//获取子目录名称
extension = Path.GetExtension(inputFile);//获取扩展名
if (string.IsNullOrWhiteSpace(extension))//如果扩展名为null那么则认为是aspx文件
{
extension = fileName + ".aspx";
}
else
{
extension = fileName + extension;
}
return tempPath;
}
#endregion
}
}

时间: 2024-10-28 12:58:50

基于asp.net MyHttpModule url重写方法的相关文章

Step1数据系统技术(1.基于404错误的URL重写技术)

现在第一篇,讨论我的网站之中使用的URL重写技术,实际上,该技术并不是我编写的,可能有用户能够记得,我的网站www.step1.cn原来就是一个博客,那个时候采用的系统是博客园提供的cnblogs程序(我将这个程序改装成能够在当时的虚拟主机上运行,可花了不少功夫),后来我将博客迁到这里之后,对Step1.cn进行大的改版,当时我实在舍不得这套博客程序之中使用的URL重写的技术,因此专门的从那个cnblogs程序之中将相关的代码从其中拆分出来成一个DLL类,在我的网站使用URL重写技术. 当时由于

关于asp.net下Url重写问题?

问题描述 1.你好,请问一下,asp.net下RewritePath是否只能进行aspx网页的重写,比如,一个站点(http://jd.abc.com)要被写为http://jd.abc.com/fff/index.asp,行不?,其中fff这是一个目录,它放了一下小的asp网站?行吗?2.在写Url重写过程中,请问有什么方法能直接对请求(HttpApplication.Request.Url属性进行重写,赋给新的值,达到当IIS在处理请求前将请求包中的Url改变成想要的Url?谢谢. 解决方案

Asp.net实现URL重写

原文:Asp.net实现URL重写 [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力:而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接:它还可以提高你的网站的安全性:而且通常会让你的网站更加便于使用和更专业. [过程]   [方法] 1.在asp.net请求管道中重写路径 2.通过组件,如微软的UrlRewriter.d

ASP.NET 中URl重写后原google收录的网页处理的问题

问题描述 我有2个问题请教1.ASP.NET中URl重写后原google收录的网页处理的问题我现在想URL静态化,用了IIRF(Ionic'sIsapiRewriteFilter)做网页重定向在IsapiRewrite4.ini文件中#重写/b-100.html到/Books/Content.aspx?ResourceID=100RewriteRule^/b-100.html$/Books/Content.aspx?ResourceID=100[U,L]现在为了保留google中保留的/Book

ASP.net的URL重写

asp.net ASP.net的RUL重写 有关于URL的重写,本文也只是拿来主意.相继有MS的组件"URLRewriter"和在Global.asax里的"Application_BeginRequest()"编码方式,以及IIS里的ISAPI设置. 娜列下来,实现方法也都很简单. 方法一:MS组件 这里也不用详解了,相关请看: http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLR

asp.net用url重写URLReWriter实现任意二级域名 高级篇_实用技巧

 我最近写了个小例子,大家可以先看这个,里面有小例子的完整代码下载 http://www.jb51.net/article/20906.htm 好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题.很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了?第一步:在浏览器键入了一个地址,比如h

asp.net用url重写URLReWriter实现任意二级域名 新_实用技巧

一般用百度搜的朋友都是对这个不了解但又急需要用的,我想,再多的语言也比不过一句代码.于是我把今天帮朋友时候写的一个小例子传了上来.这个小例子的目的是实现对任意url的重写(但不包括二级域名的,有需要二级域名的也可以先了解下url重写的概念). 这个小项目的制作过程如下 1.需要对诸如http://jb51.net/viewnews/2009/3/2.html的url进行重写.将其重写为http://jb51.net/viewnews.aspx?id=2&year=2009&month=3

asp.net用url重写URLReWriter实现任意二级域名第1/2页_实用技巧

好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题. 很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了? 第一步:在浏览器键入了一个地址,比如http://love.kerry.com,点回车后,都发生了什么? 为了把问题简单化,我来这样解释: 第二步:首先,键入的地址被解析,最终来

asp.net用url重写URLReWriter实现任意二级域名

好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题. 很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了? 第一步:在浏览器键入了一个地址,比如http://www.bianceng.cn,点回车后,都发生了什么? 为了把问题简单化,我来这样解释: 第二步:首先,键入的地址被解析,最终