采用HttpModules来重写URLs(实践篇)
2007-11-26 11:30
423 查看
首先写一个处理URLs重写的类,并且这个类必须继承IHttpHandler接口,以博客园的程序为例:
public class UrlReWriteModule : System.Web.IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest +=new EventHandler(context_BeginRequest);
}
public void Dispose()
{
}
}
UrlReWriteModule类就是处理URLs重写的类,继承IHttpHandler接口,实现该接口的两个方法,Init和Dispose。在Init方法里注册自己定义的方法,如上例所示:
content.BeginRequest +=new EventHandler(content_BeginRequest);
BeginRequest是一个事件,在收到新的Http请求时触发,content_BeginRequest就是触发时处理的方法。另外说明一点,HttpModules能注册的方法还有很多,如:EndRequest、Error、Disposed、PreSendRequestContent等等。
在content_BeginRequest方法中具体处理URLs重写的细节,比如,将 http://www.cnblogs.com/rrooyy/archive/2004/10/24/56041.html 重写为 http://www.cnblogs.com/archive.aspx?user=rrooyy&id=56041 (注:我没有仔细看DuDu的程序,这里只是举例而已)。然后将重新生成的Url用HttpContext.RewritePath()方法重写即可,如下:
private void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
// 获取旧的Url
string url = context.Request.Path.ToLower();
// 重新生成新的Url
string newUrl = ...; // 具体过程略
// 重写Url
context.RewritePath(newUrl);
}
提醒:newUrl的格式不是http://www.infotouch.com/user/archive.aspx,而是从当前应用程序根目录算起的绝对路径,如:user/archive.aspx,这一点请特别注意。
最后要web.config中注册重写URLs的类,格式如下:
<HTTPMODULES>
<ADD type="classname,assemblyname" name="modulename"/>
<REMOVE name="modulename"/>
<CLEAR />
</HTTPMODULES>
采用<ADD>标签可以注册一个类;<REMOVE>可以移除某个类,如果某个子目录不希望继承父目录的某个Http Module注册,就需要使用这个标签;<CLEAR />可以移除所有的Http Module注册。
看完偿的文章,想再去看看。好像挺简单的。 回复 引用 查看
让新手看了有兴趣继续深入研究~~
我看了你这篇文章,再去看DUDU的。TEXT里的URL REWRITING的源码
的时候已经清晰很多了,谢谢!!
继续支持你,很喜欢你这种写作风格!!! 回复 引用 查看
我的为什么不能定向到新的页面???
Test目录下的 UrlReWriteDefault.aspx 文件?
//以下用来执行请求重定向
void OnBeginRequest(object sender, EventArgs e)
{
((HttpApplication)sender).Response.Write("HttpModule的 beginRequest!");
HttpContext context = ((HttpApplication)sender).Context;
// 获取旧的Url
string url = context.Request.Path.ToLower();
// 重新生成新的Url
string newUrl = @"Test/UrlReWriteDefault.aspx"; // 具体过程略
// 重写Url
context.RewritePath(newUrl);
} 回复 引用 查看
((HttpApplication)sender).Response.Write("HttpModule的 beginRequest!");
重定向时不要再向上下文写内容了。 回复 引用 查看
public class UrlReWriteModule : System.Web.IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest +=new EventHandler(context_BeginRequest);
}
public void Dispose()
{
}
}
UrlReWriteModule类就是处理URLs重写的类,继承IHttpHandler接口,实现该接口的两个方法,Init和Dispose。在Init方法里注册自己定义的方法,如上例所示:
content.BeginRequest +=new EventHandler(content_BeginRequest);
BeginRequest是一个事件,在收到新的Http请求时触发,content_BeginRequest就是触发时处理的方法。另外说明一点,HttpModules能注册的方法还有很多,如:EndRequest、Error、Disposed、PreSendRequestContent等等。
在content_BeginRequest方法中具体处理URLs重写的细节,比如,将 http://www.cnblogs.com/rrooyy/archive/2004/10/24/56041.html 重写为 http://www.cnblogs.com/archive.aspx?user=rrooyy&id=56041 (注:我没有仔细看DuDu的程序,这里只是举例而已)。然后将重新生成的Url用HttpContext.RewritePath()方法重写即可,如下:
private void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
// 获取旧的Url
string url = context.Request.Path.ToLower();
// 重新生成新的Url
string newUrl = ...; // 具体过程略
// 重写Url
context.RewritePath(newUrl);
}
提醒:newUrl的格式不是http://www.infotouch.com/user/archive.aspx,而是从当前应用程序根目录算起的绝对路径,如:user/archive.aspx,这一点请特别注意。
最后要web.config中注册重写URLs的类,格式如下:
<HTTPMODULES>
<ADD type="classname,assemblyname" name="modulename"/>
<REMOVE name="modulename"/>
<CLEAR />
</HTTPMODULES>
采用<ADD>标签可以注册一个类;<REMOVE>可以移除某个类,如果某个子目录不希望继承父目录的某个Http Module注册,就需要使用这个标签;<CLEAR />可以移除所有的Http Module注册。
评论
#1楼 2005-01-15 00:49 丘陵狼
原来看过msdn上关于url rewriting的那篇文章,看得一头雾水,看完偿的文章,想再去看看。好像挺简单的。 回复 引用 查看
#2楼 2005-08-21 10:56 NickYao [未注册用户]
确实写得比较通俗易懂~~让新手看了有兴趣继续深入研究~~
我看了你这篇文章,再去看DUDU的。TEXT里的URL REWRITING的源码
的时候已经清晰很多了,谢谢!!
继续支持你,很喜欢你这种写作风格!!! 回复 引用 查看
#3楼 2006-03-28 11:53 aa [未注册用户]
DUDU 源码在哪儿? 回复 引用 查看#4楼 2006-04-05 23:02 MS的明天
我同样也是看了msdn上关于url rewriting后,才到这里来的 回复 引用 查看#5楼 2007-03-03 22:27 czj_earth [未注册用户]
你好!我的为什么不能定向到新的页面???
Test目录下的 UrlReWriteDefault.aspx 文件?
//以下用来执行请求重定向
void OnBeginRequest(object sender, EventArgs e)
{
((HttpApplication)sender).Response.Write("HttpModule的 beginRequest!");
HttpContext context = ((HttpApplication)sender).Context;
// 获取旧的Url
string url = context.Request.Path.ToLower();
// 重新生成新的Url
string newUrl = @"Test/UrlReWriteDefault.aspx"; // 具体过程略
// 重写Url
context.RewritePath(newUrl);
} 回复 引用 查看
#6楼 2007-03-05 09:06 阿当 [未注册用户]
去掉这一句:((HttpApplication)sender).Response.Write("HttpModule的 beginRequest!");
重定向时不要再向上下文写内容了。 回复 引用 查看
相关文章推荐
- 采用HttpModules来重写URLs(实践篇)
- [转]采用HttpModules来重写URLs(实践篇)
- 采用HttpModules来重写URLs(实践篇)
- 采用HttpModules来重写URLs(实践篇)
- 采用HttpModules来重写URLs(实践篇)
- 采用HttpModules来重写URLs(实践篇)
- 采用HttpModules来重写URLs(实践篇)
- 采用HttpModules来重写URLs(原理篇+实践)
- 采用HttpModules来重写URLs(实践篇)
- 采用HttpModules来重写URLs(实践篇)转
- 采用HttpModules来重写URLs(原理篇) +(实践篇)
- 采用HttpModules来重写URLs
- 采用HttpModules来重写URLS
- 采用HttpModules来重写URLs
- 采用HttpModules来重写URLs
- [学习]采用HttpModules来重写URLs
- 采用HttpModules来重写URLs(原理篇)转
- 采用HttpModules来重写URLs
- 采用HttpModules来重写URLs(原理篇)
- 采用HttpModules来重写URLs(原理篇)