18

クエリ文字列パラメーターにアクセスして、それをセッション変数に保存しようとしています。私が取り組んでいるソリューションにはいくつかの基本レイアウトがあるため、最も簡単な方法は、これをパイプライン ハンドラーに追加することです。ただし、args.Context.Session が null であるため、私のコードは失敗しています。

public class SaveQueryStringToSession : HttpRequestProcessor
{
    public override void Process(HttpRequestArgs args)
    {
        Assert.ArgumentNotNull((object)args, "args");
        string queryString = WebUtil.GetQueryString("parm1");
        if (queryString.Length <= 0)
            return;
        args.Context.Session["parm1"] = queryString;
    }
}

これは、このメソッドが HttpRequestBegin または HttpRequestEnd パイプラインに挿入されたときに発生します。その理由と、ここで使用する標準的な回避策またはパターンがあるかどうかを知りたいです。(はい、null チェックを追加します。それを指摘する必要はありません。)

IIS 7.5 (Integrated .Net 2.0) で Sitecore Sitecore.NET 6.4.1 (rev. 110720) を実行しています。

おそらく関連するリンク:

4

2 に答える 2

22

HttpRequestBegin パイプラインは HttpApplication.BeginRequest イベントに接続されており、このイベントは HttpSession オブジェクトがインスタンス化される前に発生します。HttpApplication.EndRequest イベントが発生するまでに HttpSession オブジェクトが既に破棄されているため、HttpRequestEnd パイプラインを使用しても機能しません。

PostAcquireRequestState イベントが発生すると、セッションが利用可能になります。これをインターセプトするには、IHttpModule を実装するクラスを作成し、それを Web.config の <httpModules> 要素に追加します。HttpModule コードは、静的リソース要求のセッションを読み取ろうとすると例外がスローされるため、要求にセッション状態が必要かどうかを確認する必要があります。

Session と QueryString にアクセスする HttpModule コードを次に示します。

public class MyHttpModule :IHttpModule
{
   public void Init(HttpApplication context)
   {
       context.PostAcquireRequestState += RequestHandler;
   }

   public void Dispose()
   {
        //
   }

   public void RequestHandler(object sender, EventArgs e)
   {
       var app = (HttpApplication) sender;

       if (app.Context.Handler is IRequiresSessionState)
       {
           var session = app.Session;
           var queryString = app.Request.QueryString["test"];
           session["test"] = queryString;
       }
   }
}

Sitecore の HttpRequestBegin および HttpRequestEnd パイプラインは、HttpModule を介して ASP.NET に接続されていることに注意してください。

<add type="Sitecore.Nexus.Web.HttpModule,Sitecore.Nexus" 
name="SitecoreHttpModule" />

私を正しい方向に向けてくれた@ddysartと、リッスンする正しいイベントについてのこの回答に感謝します。

于 2012-11-13T06:13:59.263 に答える