1

カスタム IHttpModule を作成しています。HttpContext セッション オブジェクトを管理する必要があります。これを可能にするために、IRequiresSessionState から継承されたカスタム IHttpHandler を追加しました。次に、セッションにアクセスできます(nullではありません)。セッションに到達できるように、ハンドラーの実行後に PreRequestHandlerExecute にロジックを記述しています。

それから私は問題に直面しました。そこに保存/保存されていないセッションに何かを追加すると。モジュール内の連続する各リクエストで、セッションに追加したオブジェクトが見つかりません。

カスタムモジュールからセッションに永続的に書き込むことは可能ですか、それとも何か不足していますか?

編集 -> R.Isajev :

public class CustomFederationModule : IHttpModule
{
    public void Dispose()
    {
        // TODO
    }

    public void Init(HttpApplication context)
    {
        context.PostAcquireRequestState += Application_PostAcquireRequestState;
        context.PostMapRequestHandler += Application_PostMapRequestHandler;
        context.PreRequestHandlerExecute += Application_PreRequestHandlerExecute;

        context.BeginRequest += OnBeginRequest;
        context.EndRequest += OnEndRequest;
        context.Error += OnErrorOccured;
    }

    private void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        System.Diagnostics.Trace.WriteLine("Session ID : " + HttpContext.Current.Session.SessionID);
        if (HttpContext.Current.Session["Isajev"] == null)
            HttpContext.Current.Session["Isajev"] = "Rastko Isajev";
    }


    private void OnEndRequest(object sender, System.EventArgs e)
    {
        if (sender is HttpApplication)
        {
            HttpResponse response = (sender as HttpApplication).Response;
            int statusCode = response.StatusCode;
        }
    }

    private void OnBeginRequest(object sender, System.EventArgs e)
    {
    }

    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 :(");
    }


    private void OnErrorOccured(object sender, System.EventArgs e)
    {
        throw new Exception("Error occured ! \n" + e.ToString());
    }

    // 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; }
        }
    }
}

カスタムモジュールでは、もともとセッションレスであるため、モジュールでセッションを使用できるようにする目的でカスタムハンドラーを使用しています。このサンプルでは、​​'Isajev' がセッションへの最初の呼び出しで追加されます。同じユーザーとブラウザからの次の呼び出しでは、セッションに存在しません。

よろしく、ラストコ

4

0 に答える 0