2009-08-22 17 views
3

URL書き換え用の単純なHttpHandlerを作成していますが、私はレンガの壁に当たっています。HttpHandlerは書き換えません

<httpHandlers> 
    <add verb="*" path="*" type="Tizma.CMS.Runtime.HttpHandler"/> 
</httpHandlers> 

私は基本的にすべての着信URLの希望:私は、web.configファイルに次の動詞を持って

public class HttpHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.RewritePath("default.aspx", false); 
     //Rewriter.Rewrite(context); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 
} 

私は物事をテストするために本当に簡単ですのHttpHandlerクラスを作成しましたこのリライターを通過する。これを実行すると、ProcessRequestが起動しますが、RewritePathはdefault.aspxに決して到達しません。

これは単なるテストであり、結局default.aspxには、次の行に沿ってクエリ文字列が渡されることに注意してください。pageid = 2私は、httphandlersが最初にどのように働いたかを理解したかったのです。

私は間違っていますか?

答えて

12

アンディ - あなたはハンドラ内でRewritePath()を呼び出すことはできません - それは、その時そのため後半への道です。ハンドラにヒットした時点で、リクエストはすでに完了しており、RewritePath()は何もしません。

RewritePathは、リクエストサイクル(BeginRequestやCacheModuleが起動する前のいずれか)で非常に早く呼び出され、HttpModuleが必要な可能性が高いため、適切な初期パイプラインイベントをフックする必要があります。

+0

私はそれが今や理にかなっていることを見ています。そのため、ハンドラは基本的にコンテンツを生成してパイプで抜き取る必要があります。それは問題ではありません。 – Andy

+0

助けてくれてありがとうリック、私は今ソートされています。 – Andy

0

あなたは何を見ますか? RewritePathは、ユーザーとは異なるURLを表示せずにパスを内部的に変更します。 default.aspxが呼び出されていれば、動作しています。

+0

これは正しいです。ユーザーのURLを変更したくないのですが、内部的にはdefault.aspxページをクエリ文字列「?pageno = 3」で開こうとしています。 Default.aspxは正しいページの詳細をレンダリングします。私の問題は、default.aspxがPage_Loadイベントに到達することはないということです。 – Andy

2

HttpHandlerを使用すると、Webフォームのメカニズム全体をオーバーライドしてリクエストを処理します(System.Web.UI.PageIHttpHandler)。お使いのマシンレベルのweb.configファイルでは、あなたのweb.configファイルは、デフォルトのハンドラマッピングをオーバーライドし、あなたのHttpHandlerが呼ばれるべきことを言うので

default.aspxにURLを書き換え
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/> 

は、あまりを達成することはありません見つけることができますdefault.aspxを含むすべてのURLを処理します。

ほとんどの場合、BeginRequestイベントを処理するHttpModuleが必要です。 HttpModuleは、標準の動作すべてをオーバーライドすることなく、要求ライフサイクルを通じて個々のイベントを処理できます。

+0

Steveに感謝します。それはまさに私が今やっていることです。私は自分のカスタムHttpModuleのBeginRequestイベントに夢中になりました。作品を扱う:) – Andy

関連する問題