2009-08-22 41 views
3

我正在爲URL重寫編寫一個簡單的HttpHandler,但是我正在打磚牆。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我只想弄清楚httphandlers是如何工作的。

我在做什麼錯?

回答

12

安迪 - 你不能在一個處理程序調用RewritePath() - 它的方式來晚了,當時。當你點擊你的處理程序時,請求已經發送到完成,並且RewritePath()不執行任何操作。

RewritePath必須在請求週期內很早被調用(像BeginRequest或CacheModule開始之前的任何事情)才能生效,因此您很可能需要一個HttpModule並掛接相應的早期管道事件。

+0

我明白了,現在有道理。所以處理程序必須基本生成內容並將其輸出。好的,那應該不成問題。 – Andy 2009-08-22 18:38:16

+0

感謝您的幫助瑞克,我現在排序。 – Andy 2009-08-22 18:44:32

0

你期望看到什麼? RewritePath會在內部更改路徑,而不會向用戶顯示不同的URL。如果調用default.aspx,那麼它正在工作。

+0

這是正確的。我不希望用戶url更改,但內部我想打開我的default.aspx頁面,查詢字符串爲?pageno = 3 Default.aspx然後呈現正確的頁面詳細信息。我的問題是,default.aspx似乎永遠不會到達Page_Load事件。 – Andy 2009-08-22 18:22:15

2

通過使用HttpHandler,您將覆蓋整個Web Forms機制以處理請求(System.Web.UI.Page implements IHttpHandler)。在您的計算機級別的web.config文件,你會發現

<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/> 

重寫URL來default.aspx不會有太大的實現,因爲你的web.config將覆蓋默認處理程序映射,並說你的HttpHandler應該叫處理所有網址,包括default.aspx

你想要一個HttpModule,最有可能處理BeginRequest事件。 HttpModule可以通過請求生命週期處理單個事件,而不會覆蓋所有的標準行爲。

+0

謝謝史蒂夫。這正是我現在所做的。我已經在我自己的自定義HttpModule中插入了BeginRequest事件。工作一個治療:) – Andy 2009-08-22 19:06:35