質問

HTTPModule内からユーザーのセッション変数を更新することで本当にできましたが、見ることができることからそれは不可能です。

UPDATE:現在、私のコードは OnBeginRequest()イベントハンドラー内で実行されています。

UPDATE:これまでに受け取ったアドバイスに従い、これをHTTPModuleの Init()ルーチンに追加してみました:

AddHandler context.PreRequestHandlerExecute、AddressOf OnPreRequestHandlerExecute

しかし、私の OnPreRequestHandlerExecute ルーチンでは、セッション状態はまだ利用できません!

ありがとう、そして何かが足りない場合はおologiesびします!

役に立ちましたか?

解決

ASP.NETフォーラムでこれを見つけました:

using System;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Diagnostics;

// This code demonstrates how to make session state available in HttpModule,
// regradless of requested resource.
// author: Tomasz Jastrzebski

public class MyHttpModule : IHttpModule
{
   public void Init(HttpApplication application)
   {
      application.PostAcquireRequestState += new EventHandler(Application_PostAcquireRequestState);
      application.PostMapRequestHandler += new EventHandler(Application_PostMapRequestHandler);
   }

   void Application_PostMapRequestHandler(object source, EventArgs e)
   {
      HttpApplication app = (HttpApplication)source;

      if (app.Context.Handler is IReadOnlySessionState || app.Context.Handler is IRequiresSessionState) {
         // no need to replace the current handler
         return;
      }

      // swap the current handler
      app.Context.Handler = new MyHttpHandler(app.Context.Handler);
   }

   void Application_PostAcquireRequestState(object source, EventArgs e)
   {
      HttpApplication app = (HttpApplication)source;

      MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

      if (resourceHttpHandler != null) {
         // set the original handler back
         HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
      }

      // -> at this point session state should be available

      Debug.Assert(app.Session != null, "it did not work :(");
   }

   public void Dispose()
   {

   }

   // a temp handler used to force the SessionStateModule to load session state
   public class MyHttpHandler : IHttpHandler, IRequiresSessionState
   {
      internal readonly IHttpHandler OriginalHandler;

      public MyHttpHandler(IHttpHandler originalHandler)
      {
         OriginalHandler = originalHandler;
      }

      public void ProcessRequest(HttpContext context)
      {
         // do not worry, ProcessRequest() will not be called, but let's be safe
         throw new InvalidOperationException("MyHttpHandler cannot process requests.");
      }

      public bool IsReusable
      {
         // IsReusable must be set to false since class has a member!
         get { return false; }
      }
   }
}

他のヒント

HttpContext.Current.Session はHTTPモジュールがパイプラインイベントを処理していないと仮定すると、正常に動作します。セッション状態が初期化される前に発生する...

編集、コメントの明確化後:を処理する場合BeginRequestイベントでは、ASP.NETランタイムによってまだ初期化されていないため、Sessionオブジェクトは実際にはnull / Nothingのままです。これを回避するには、 PostAcquireRequestState - PreRequestHandlerExecute そのため、すべての低レベルの作業はこの段階でほぼ完了していますが、通常の処理を先取りします。

IHttpModule HttpContext.Current.Session へのアクセスは、 PreRequestHandlerExecute ハンドラーで実行できます。

PreRequestHandlerExecute :" ASP.NETがイベントハンドラー(ページやXML Webサービスなど)の実行を開始する直前に発生します。"これは、「aspx」ページが提供される前に、このイベントが実行されることを意味します。 「セッション状態」が利用できるため、自分をノックアウトできます。

例:

public class SessionModule : IHttpModule 
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += BeginTransaction;
            context.EndRequest += CommitAndCloseSession;
            context.PreRequestHandlerExecute += PreRequestHandlerExecute;
        }



        public void Dispose() { }

        public void PreRequestHandlerExecute(object sender, EventArgs e)
        {
            var context = ((HttpApplication)sender).Context;
            context.Session["some_sesion"] = new SomeObject();
        }
...
}

ページまたはハンドラーを介してasp.net要求に適用するマネージアプリケーションで通常の基本的なHttpModuleを記述している場合は、セッション作成後のライフサイクルでイベントを使用していることを確認するだけです。 。通常、Begin_Requestの代わりにPreRequestHandlerExecuteを使用します。 mdbは彼の編集でそれを正しく持っています。

最初は質問への回答としてリストされている長いコードスニペットは機能しますが、最初の質問よりも複雑で広範です。 IRequiresSessionStateインターフェイスを実装できるASP.netハンドラーがないコンテンツからコンテンツが来ている場合に処理し、セッションメカニズムをトリガーして利用できるようにします。 (ディスク上の静的gifファイルのように)。基本的にはダミーハンドラーを設定し、そのインターフェイスを実装するだけでセッションが利用可能になります。

コードのセッションだけが必要な場合は、モジュールで処理する適切なイベントを選択してください。

試してみてください:クラスMyHttpModuleで宣言:

private HttpApplication contextapp;

その後:

public void Init(HttpApplication application)
{
     //Must be after AcquireRequestState - the session exist after RequestState
     application.PostAcquireRequestState += new EventHandler(MyNewEvent);
     this.contextapp=application;
}  

そのため、同じクラスの別のメソッド(イベント)で:

public void MyNewEvent(object sender, EventArgs e)
{
    //A example...
    if(contextoapp.Context.Session != null)
    {
       this.contextapp.Context.Session.Timeout=30;
       System.Diagnostics.Debug.WriteLine("Timeout changed");
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top