2009-09-03 27 views
14

Oturum durumunu görebildiğimde değiştirmem gerekiyor. IRequiresSessionState İşaretleyici Arayüzü hakkında bilgi aldım, ancak nasıl kullanılacağını anlayamadım. Sanırım bariz bir şey eksik olabilirim. Biriniz C# guru bana 1-2-3 adım arası hızlı bir yol verebilir mi (ör.)? IRequiresSessionState - nasıl kullanırım?

  1. yeni bir sınıf oluşturma

    ,
  2. İçinde public interface IRequiresSessionState koyun.
  3. Değeri değiştirmek için IRequiresSessionState('abra_cadabra')'u kullanın.

cevap

11
  1. bir sınıf mevcut sınıfının adıyla iki nokta üst üste ekleyip işaretleyici koymak işaretlemek için:

    bu bağlantıyı kontrol, bir HTTP işleyicisi bunu nasıl uyguladıklarını görmek için. Eğer bir sınıfım varsa: İşaretli, public class PageTools : IRequiresSessionState veya her iki arabirim ile public class PageTools : IRequiresSessionState, IHttpHandler gibi görünecektir. Benim durumumda, sınıfımın sadece birinciyle işaretlenmesi gerekiyordu. İşleyicimin ikisi de gerekiyordu.
  2. Sadece yazdığınız işaretçiyi tıklarsanız, menüden (görsel stüdyo) implement'u seçebilir ve sınıfınıza gerekli yöntemler eklenecektir. Ya da onlara bakıp el ile ekleyebilirsiniz.
  3. IRequiresSessionState işaretleyicisine sahip olduğunuzda, oturum durumunun salt okunur olup olmadığını sınayıp test edip, yeni bir http işleyici ayarladıysanız sınayabilirsiniz.

    if (context.Handler is IReadOnlySessionState 
        || context.Handler is IRequiresSessionState) 
    { 
        context.Handler = Handler(); 
    } 
    
  4. http işleyicisi: MSDN size HttpHandlers ve HttpModules hakkında çok şey söyleyecektir. Benim durumumda, yalnızca normal olarak okunduğunda (Page_PreInit) oturum durumuna erişebilmem için bir kukla işleyiciye ihtiyacım vardı.

    protected IHttpHandler Handler() 
    { 
        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler 
         as MyHttpHandler; 
        if (resourceHttpHandler != null) // set the original handler back 
        {     
         return resourceHttpHandler.OriginalHandler; 
        } 
        // at this point session state should be available  
        return HttpContext.Current.Handler; 
    } 
    
    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; } 
        } 
    } 
    

Here ben çok var ya da ne kullandım hangi bir çok şık HttpModule'ü sınıfına bir referanstır: Yani benim sınıfta ben bu ekledi. Umarım bu birisine yardım eder.

9

Sen SessionState erişim elde etmek sadece IRequiresSessionState adresinin HTTP Handler sınıf türetmek gerekir.

public class MyHttpHandler : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     var MyValue = context.Session["MyKey"] as String; 

     MyValue = "Hello World"; 

     context.Session["MyKey"] = MyValue; 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 
+0

IRequiresSessionState'den HTTP Handler sınıfını nasıl kullanacağımı açıklayabilir misiniz? – Praesagus

+0

Ding. Ding. Oturum durum değişkenimin neden yardımcımda çalıştığımı anlamaya çalışmak için birkaç saat harcadım. self.thank = Ton (1). –

İlgili konular