我正在写一个简单的HttpHandler重写网址,但我遇到了一个砖墙。
我已经创建了一个HttpHandler类,它非常简单,只用于测试:
public class HttpHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.RewritePath("default.aspx", false);
//Rewriter.Rewrite(context);
}
public bool IsReusable
{
get
{
return true;
}
}
}然后,我在web.config中使用了以下动词:
<httpHandlers>
<add verb="*" path="*" type="Tizma.CMS.Runtime.HttpHandler"/>
</httpHandlers>我基本上希望所有传入的URL都要经过这个重写器。当我运行这段代码时,ProcessRequest会触发,但RewritePath永远不会到达default.aspx。
请记住,这只是一个测试,最终会向default.aspx传递一个类似于?pageid=2的查询字符串,我只是想先弄清楚how是如何工作的。
我做错了什么?
发布于 2009-08-22 18:31:04
Andy -你不能在处理程序中调用RewritePath() -那时候就太晚了。当您遇到处理程序时,请求已经完成,RewritePath()什么也不做。
RewritePath必须在请求周期的早期被调用(比如BeginRequest或CacheModule生效之前的任何东西)才能生效,因此您很可能需要一个HttpModule并挂接适当的早期管道事件。
发布于 2009-08-22 19:01:40
通过使用HttpHandler,您覆盖了处理请求的整个Web Forms机制(System.Web.UI.Page实现了IHttpHandler)。在您的机器级别的web.config文件中,您将找到
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>将URL重写为default.aspx不会有多大效果,因为您的web.config覆盖了默认的处理程序映射,并表示应该调用HttpHandler来处理所有URL,包括default.aspx。
您需要一个最有可能处理BeginRequest事件的HttpModule。HttpModule可以在整个请求生命周期中处理单个事件,而无需覆盖所有标准行为。
发布于 2009-08-22 18:20:35
你可以试试"http://urlrewriter.net/“。它提供了您需要的开箱即用解决方案。
http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
https://stackoverflow.com/questions/1316622
复制相似问题