0

すべて、HttpModule (IHttpModule) を実装して、ページ リクエストをキャッチし、新しいページにリダイレクトしようとしています。Session残念ながら、新しいページでは を使用できないようです。Sessionが null であるためです。

これが私のコードのようです。見直してください。

public class MyModule : IHttpModule
{
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);

        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            ....
            HttpContext.Current.Server.Transfer("newpage.aspx");//redirect to new page.
        }
}

には、コードnewpage.aspxの例外があります。 が nullであるためです。誰か教えてくれませんか?ありがとう。Object reference not set to an instance of an objectHttpContext.Current.Session[xxx]HttpContext.Current.Session

アップデート

すべて、 を使用しHttpContext.Current.Response.Redirectて url をリダイレクトする場合に見つかりました。全て大丈夫。つまり、Sessionオブジェクトは使用される前に開始されます。しかし、それは では機能しませんServer.Transfer

この2 つの違いは何なのか、私はすでに知っていました。

4

1 に答える 1

0

2 つのモジュールを含む通常の aspx ランタイム パイプラインは次のとおりです。

--> HttpModule_1.BeginRequest();  --> HttpModule_2.BeginRequest(); --> HttpHandler(Page)
<-- HttpModule_1.EndRequest();  <-- HttpModule_2.EndRequest(); <-- HttpHandler(Page)

HttpModule_1 をカスタム モジュールとして、HttpModule_2 を aspx セッション モジュールとして想像してください。

カスタム モジュールが最初に実行されるため、モジュールの実行中にセッションは埋められません。

HttpModule_1 が BeginRequest を実行しているときに、Server.Trasfer() を追加します。これで、サーバー転送は要求ページの HttpHandler をすぐに実行し、BeginRequest を離れることなく呼び出され、ハンドラーが完了した後、転送メソッドは Request.End() を実行して処理を終了します。

そのため、「newpage.aspx」のハンドラーもセッ​​ション モジュールの前に実行されます。(実際には、Server.Transfer() が要求を終了するため、セッション モジュールは実行されません)。

セッション モジュールがモジュールの前に処理されることを保証する場合は、問題を解決する必要があります ( https://stackoverflow.com/a/2427632/953144を参照)。

于 2013-07-31T10:27:42.917 に答える