HttpHandler未重写

3

我正在编写一个简单的HttpHandler来进行URL重写,但是遇到了一个难题。

为了测试,我创建了一个非常简单的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的查询字符串,我只想先弄清楚httphandlers的工作原理。

我做错了什么?

4个回答

12

Andy - 你不能在处理程序中调用RewritePath(),因为那时已经太晚了。当请求到达处理程序时,它已经完成路由,而RewritePath()不会起作用。

RewritePath必须在请求周期的早期阶段(例如BeginRequest或在CacheModule启动之前)调用才能生效,因此您很可能需要一个HttpModule并挂接适当的早期管道事件。


我明白了,现在有意义了。所以处理程序基本上必须生成内容并将其输出。好的,这应该不是问题。 - Andy
谢谢你的帮助,Rick。我现在搞定了。 - Andy

2

通过使用 HttpHandler,您可以覆盖整个 Web Forms 处理请求的机制(System.Web.UI.Page 实现了 IHttpHandler)。在您的机器级 web.config 文件中,您会发现

(注意:本文中的术语“Web表单”指的是ASP.NET Web Forms框架)
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>

将URL重写为default.aspx并不能实现太多,因为您的web.config覆盖了默认的处理程序映射,并指定您的HttpHandler应该被调用来处理所有URL,包括default.aspx

您需要一个HttpModule,很可能处理BeginRequest事件。 HttpModule可以在请求生命周期中处理单个事件,而不覆盖所有标准行为。


谢谢 Steve。那正是我现在正在做的。我已经钩入了自己定制的 HttpModule 上的 BeginRequest 事件。效果很好 :) - Andy

1

0
你期望看到什么?RewritePath 在不向用户显示不同 URL 的情况下在内部更改路径。如果调用 default.aspx,则它正在工作。

没错。我不想改变用户的URL,但是在内部,我想用查询字符串“?pageno=3”打开我的default.aspx页面。然后,Default.aspx会呈现正确的页面细节。我的问题是,default.aspx似乎永远无法到达它的Page_Load事件。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接