আমি কি কোনও HTTPModule থেকে সেশন স্থিতি অ্যাক্সেস করতে পারি?


85

আমি আমার HTTPModule এর মধ্যে থেকে কোনও ব্যবহারকারীর সেশন ভেরিয়েবলগুলি আপডেট করার সাথে সত্যিই করতে পারি, তবে যা আমি দেখতে পাচ্ছি তা সম্ভব নয়।

আপডেট: আমার কোড বর্তমানে OnBeginRequest ()ইভেন্ট হ্যান্ডলারের ভিতরে চলছে ।

আপডেট: এ পর্যন্ত প্রাপ্ত পরামর্শ অনুসরণ করে, আমি Init ()আমার এইচটিটিপি মডুলেটে এটি রুটিনে যুক্ত করার চেষ্টা করেছি:

AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute

তবে আমার OnPreRequestHandlerExecuteরুটিনে, সেশন স্টেটটি এখনও অনুপলব্ধ!

ধন্যবাদ, এবং যদি আমি কিছু মিস করছি তবে দুঃখিত!

উত্তর:


83

এটি এএসপি.এনইটি ফোরামে পাওয়া গেছে :

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

8
এমএসকে এটি ঠিক করা উচিত! ... আমি যদি আইআরকিয়ারসেশন স্টেট বাস্তবায়ন হিসাবে কোনও মডিউল চিহ্নিত করি তবে এটি পেতে আমাকে একটি হুপ থেকে ঝাঁপিয়ে পড়তে হবে না ... (সেক্সি কোডটি সত্যই)
বিগবোনডেভাইকিং

6
চমৎকার কোড। আমি ভেবেছিলাম আমার এটির প্রয়োজন হবে, তবে এটি পরিণত হয় না। এই কোডটি প্রতিটি চিত্র এবং সার্ভারের মধ্য দিয়ে যাওয়া অন্যান্য পৃষ্ঠা-বিহীন উত্সের জন্য সেশনটি লোড করা শেষ করে। আমার ক্ষেত্রে, আমি কেবল পোস্টঅ্যাকুইয়াররেউকস্টেস্ট ইভেন্টে সেশনটি বাতিল কিনা তা যাচাই করে থাকি এবং তা হলে ফিরে আসে।
আবতিন ফোরউজান্দেহ

7
এই কোডটি কার্যকর যদি অনুরোধ করা সংস্থানটি সেশন স্থিতি পরিচালনা করে না। স্ট্যান্ডার্ড .aspx পৃষ্ঠাগুলির জন্য পোস্টঅ্যাকোয়ায়ারিক্যুয়েস্টস্টেট ইভেন্ট হ্যান্ডলারের সেশনটিতে অ্যাক্সেস করার জন্য কেবল আপনার কোড যুক্ত করুন। সেশন স্টেটটি কোনও বিগিনিউকুয়েস্ট ইভেন্ট হ্যান্ডলারে উপলভ্য হবে না কারণ সেশন স্টেটটি এখনও অর্জিত হয়নি।
জ্যাকালিকো

4
এটা আমার ক্ষেত্রে কাজ করে না। আমি পেয়েছি "এই প্রসঙ্গে সেশন স্টেট উপলভ্য নয়।" যখন কোনও স্থিতিশীল ফাইল অ্যাক্সেস করার চেষ্টা করার অনুরোধ থাকে। কোন সাহায্য ?
ম্যাক্সিসাম

4
স্ট্যাটিক ফাইলগুলিতে কাজ করার জন্য, আমি পূর্ববর্তী অবস্থা = "পরিচালিত হ্যান্ডলার" (<নাম নাম = "সেশন" /> <যোগ নাম = "মুছে ফেলে সেশন মডিউলটি (ওয়েবকনফিগে) পুনরায় নিবন্ধভুক্ত করেছি" সেশন "প্রকার =" সিস্টেম.ওয়েব.সেশনস্টেট.সেশনস্টেটমডিউল "/>)
nlips

39

এইচটিটিপি কনটেক্সট.কন্টেনার.সেশনটি কেবলমাত্র কাজ করা উচিত, ধরে নিই যে আপনার এইচটিটিপি মডিউলটি কোনও পাইপলাইন ইভেন্টগুলি পরিচালনা করছে না যা সেশনের অবস্থা শুরু হওয়ার আগে ঘটে ...

মন্তব্যগুলি স্পষ্ট করার পরে সম্পাদনা করুন: বিগিনিউকুয়েস্ট ইভেন্টটি পরিচালনা করার সময় , সেশন অবজেক্টটি এখনও নির / কিছুই হবে না, কারণ এটি এখনও এএসপি.নেট রানটাইম দ্বারা আরম্ভ করা হয়নি। এই সমস্যা এড়ানোর জন্য, আপনার হ্যান্ডলিং কোড একটি ঘটনার পরে যেটা সরাতে PostAcquireRequestState আমি - PreRequestHandlerExecute যে নিজেকে জন্য, যেমন সব নিম্ন স্তরের কাজ প্রায় কাছাকাছি এই পর্যায়ে সম্পন্ন করা হয়, কিন্তু আপনি এখনও কোনো স্বাভাবিক প্রক্রিয়াকরণ অগ্রক্রয়াধিকারবলে কেনা বা পাওয়া।


দুর্ভাগ্যক্রমে এটি HTTPModule- এ উপলব্ধ নয় - "অবজেক্ট রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা নেই।"
ক্রিস রবার্টস

আমি 'অনবেইনকোয়েস্ট' প্রক্রিয়া করছি?
ক্রিস রবার্টস

আপডেটের জন্য ধন্যবাদ. যদি আমি এটি কোনও অ্যাপ্লিকেশন স্তরের ইভেন্টে পরিচালনা করি তবে আমি কেন এইচটিটিপিএমডুল ব্যবহার না করে অ্যাপ্লিকেশন পর্যায়ে আমার সমস্ত প্রসেসিং করব?
ক্রিস রবার্টস

4
পোস্টএকুইয়ারআরউইকস্টেট কোনও 'অ্যাপ্লিকেশন স্তরের ইভেন্ট' নয়: উদাহরণস্বরূপ, যদি HTTP অনুরোধটি কোনও ওয়েব সার্ভিস হ্যান্ডলার দ্বারা পরিচালনা করা হয় তবে উদাহরণস্বরূপ, আপনি এটি এখনও আপনার HTTP মডিউলে দেখতে পাবেন তবে গ্লোবাল.এক্সএক্সে নয় ...
এমডিবি

এটি আমার পক্ষে নির্ভরযোগ্যভাবে কাজ করছে বলে মনে হয় না। নিম্নলিখিত কোডটি প্রায়শই একটি ব্যতিক্রম ঘটায় 'সেশন স্টেট এই প্রসঙ্গে উপলব্ধ নয়'। আসলে এটি ভিএস ডিবাগারটিকে বেশ দর্শনীয়ভাবে ক্র্যাশ করেছে। প্রসঙ্গ.প্রিয়রউকেস্টহ্যান্ডলারএক্সেকিউট + = (প্রেরক, আরগস) => কনসোল.উরাইট (((HTTP প্রয়োগ) প্রেরক)। সেশন ["পরীক্ষা"];
সিবিপি

15

অ্যাক্সেস করা HttpContext.Current.Sessionএকটি IHttpModuleমধ্যে সম্পন্ন করা যাবে PreRequestHandlerExecuteহ্যান্ডলার।

PreRequestHandlerExecute : "ASP.NET একটি ইভেন্ট হ্যান্ডলার কার্যকর করতে শুরু করার ঠিক আগে ঘটে (উদাহরণস্বরূপ, একটি পৃষ্ঠা বা একটি এক্সএমএল ওয়েব পরিষেবা)" এর অর্থ একটি 'এসপেক্স' পৃষ্ঠা পরিবেশন করার আগে এই ইভেন্টটি কার্যকর করা হবে। 'সেশন স্টেট' উপলভ্য যাতে আপনি নিজেকে নক আউট করতে পারেন।

উদাহরণ:

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

আমি এটি চেষ্টা করেছিলাম, এবং আপনি সত্যই অধিবেশন পাবেন। তবে দেখে মনে হচ্ছে অনুরোধহীডার পুরোপুরি সেখানে নেই, বিশেষত হেডার কনটেন্টটাইপ
ম্যাথিয়াস মুলার

12

আপনি যদি কোনও পরিচালিত অ্যাপ্লিকেশনটিতে একটি সাধারণ, বেসিক এইচটিপিএমডিউল লিখছেন যা আপনি পৃষ্ঠাগুলি বা হ্যান্ডলারের মাধ্যমে এসপ নেটওয়ারের অনুরোধগুলিতে প্রয়োগ করতে চান তবে আপনাকে কেবল সেশনটি তৈরির পরে লাইফসাইলে কোনও ইভেন্ট ব্যবহার করছেন তা নিশ্চিত করতে হবে। প্রারম্ভিক্য্যান্ডহ্যান্ডলারএক্সিকিউটের পরিবর্তে বিগেইন_রেইকুয়েস্ট সাধারণত আমি যেখানে যাই। এমডিবি ঠিক আছে তার সম্পাদনায়।

মূলত প্রশ্নের উত্তর হিসাবে তালিকাভুক্ত দীর্ঘ কোড স্নিপেট কাজ করে তবে প্রাথমিক প্রশ্নের চেয়ে জটিল এবং বিস্তৃত। এটি যখন কেসটি হ্যান্ডেল করবে তখন এমন কোনও বিষয় থেকে আসবে যেখানে কোনও এএসপিএনএল হ্যান্ডলার উপলব্ধ নেই যেখানে আপনি আইআরকায়ারসেশনসেটস্টেট ইন্টারফেসটি প্রয়োগ করতে পারবেন, এভাবে এটি সেশন মেকানিজমটিকে উপলভ্য করে তুলবে। (ডিস্কে একটি স্ট্যাটিক জিআইএফ ফাইলের মতো)। এটি মূলত একটি ডামি হ্যান্ডলার সেট করে যা সেশনটি উপলব্ধ করার জন্য সেই ইন্টারফেসটি প্রয়োগ করে।

আপনি যদি কেবল আপনার কোডের জন্য সেশন চান তবে আপনার মডিউলে হ্যান্ডেল করার জন্য সঠিক ইভেন্টটি চয়ন করুন।


0

এটি ব্যবহার করে দেখুন: ক্লাসে 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");
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.