ASP.NET'teki herhangi bir sınıftan oturum değişkenlerine nasıl erişilir?


157

Uygulamamdaki App_Code klasöründe bir sınıf dosyası oluşturdum. Bir oturum değişkenim var

Session["loginId"]

Sınıfımdaki bu oturum değişkenlerine erişmek istiyorum, ancak aşağıdaki satırı yazarken hata veriyor

Session["loginId"]

Herkes bana ASP.NET 2.0 (C #) app_code klasöründe oluşturulan bir sınıf içinde oturum değişkenlerine erişmek nasıl söyleyebilir

Yanıtlar:


363

(Tamlık için güncellendi)
Oturum değişkenlerine herhangi bir sayfadan veya Session["loginId"]herhangi bir sınıftan ve herhangi bir sınıftan (örn. Sınıf kitaplığının içinden) kullanarak denetime erişebilirsiniz.System.Web.HttpContext.Current.Session["loginId"].

Ama lütfen orijinal cevabım için okumaya devam edin ...


Her zaman oturum değişkenlerine erişimi kolaylaştırmak için ASP.NET oturumu çevresinde bir sarmalayıcı sınıf kullanın:

public class MySession
{
    // private constructor
    private MySession()
    {
      Property1 = "default value";
    }

    // Gets the current session.
    public static MySession Current
    {
      get
      {
        MySession session =
          (MySession)HttpContext.Current.Session["__MySession__"];
        if (session == null)
        {
          session = new MySession();
          HttpContext.Current.Session["__MySession__"] = session;
        }
        return session;
      }
    }

    // **** add your session properties here, e.g like this:
    public string Property1 { get; set; }
    public DateTime MyDate { get; set; }
    public int LoginId { get; set; }
}

Bu sınıf, ASP.NET oturumunda kendisinin bir örneğini depolar ve oturum özelliklerinize, örneğin aşağıdaki gibi herhangi bir sınıftan güvenli bir şekilde erişmenizi sağlar:

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

Bu yaklaşımın birkaç avantajı vardır:

  • sizi çok sayıda dökümden kurtarır
  • uygulamanız boyunca sabit kodlu oturum anahtarlarını kullanmak zorunda değilsiniz (ör. Oturum ["loginId"]
  • MySession'ın özelliklerine XML doc yorumları ekleyerek oturum öğelerinizi belgeleyebilirsiniz
  • oturum değişkenlerinizi varsayılan değerlerle başlatabilirsiniz (örn. boş olmadığından emin olma)

6
Herhangi bir kod yazmaya gerek yoktur, cevapta gösterildiği gibi kullanın. Örneğin, "public int LoginId {get; set;}" -> buna otomatik özellik denir.
M4N

4
.Net 3.x kullanıyorsanız kodumda gösterildiği gibi otomatik özellikleri kullanabilirsiniz. .Net 2.x / 1.x ile bu kullanılamaz ve mülklerinizin alıcısını / ayarlayıcısını kendiniz uygulamanız gerekir: private int _loginId; public int LoginId {get {return _loginId; } set {_loginId = değer; }}
M4N

2
Şimdi harika görünüyor, sorunumun cevabını aldım ve yolunuzu kullanıyorum, tüm oturum değişkenlerimi tek bir yerde tutmak çok temiz ve kolay. Teşekkürler @ Martin, harikasın.
Prashant

23
@ M4N, +1'den biraz daha şükranlarımı ifade edebilseydim. Bu, projelerimdeki oturum / önbellekle uğraşmanın en sevdiğim yolu oldu. Kodum, kelimenin tam anlamıyla size teşekkür ediyor.
Brandon Boone

4
@Kristopher, 'Current' özelliği statikken, MySession örneği döndürülmüyor ... bu yüzden iyi. Statik yöntemlerin ve özelliklerin bu şekilde kullanılması güvenlidir.
Darren

104

Oturum HttpContext iş parçacığı üzerinden erişmek: -

HttpContext.Current.Session["loginId"]

Bu basit adım için bir ton Anthony'ye teşekkürler.
Kings

Çok teşekkürler Anthony, bunun için + 1
Owais Qureshi

Teşekkürler. İsim alanının ne olduğunu unuttum :)
Anthony Horne

@AnthonyWJones yönteminizi kullandım, ancak sorun yaşıyorum, nerede olduğumu açıklayabilir misiniz, ya da doğru kullanmanın yolu nedir, sorum şu stackoverflow.com/questions/45254279/…
adnan

ve HttpSessionStateBase dönüştürmek istiyorsanız: HttpSessionStateBase session = new HttpSessionStateWrapper (HttpContext.Current.Session); re: stackoverflow.com/questions/5447611/…
sobelito

24

Önerilen çözümle ilgili sorun, işlem dışı oturum depolaması kullanıyorsanız, SessionState'te yerleşik bazı performans özelliklerini bozabilmesidir. ("Durum Sunucusu Modu" veya "SQL Sunucusu Modu"). Oop modlarında, oturum verilerinin sayfa isteğinin sonunda serileştirilmesi ve sayfa isteğinin başlangıcında serileştirilmesi gerekir; bu da maliyetli olabilir. Performansı artırmak için SessionState, yalnızca ilk kez erişildiğinde değişkenin serisini kaldırmak için gerekenleri serileştirmeye çalışır ve yalnızca değiştirilen değişkeni yeniden serileştirir ve değiştirir. Eğer oturum değişken bir sürü var ve hepsini bir sınıfa itmek Eğer esas olarak oturumda oturum kullanan her sayfa isteği her şey serileştirilecek ve sadece 1 özellik değişti bile sınıf değişti rağmen her şey tekrar serileştirilmesi gerekir. Sadece oturum bir sürü ve bir oop modu kullanıyorsanız dikkate alınması gereken bir şey.


4
Bunu arttırmak için +1. Oturum için InProc kullanmıyorsanız, Ernie% 100 doğrudur. InProc, web çiftliklerini desteklemediği ve uygulama yeniden başlatıldığında kaybolacağı için zaten çok sınırlıdır. Performans maliyetiyle, State Server modunun kullanımında% 20'lik bir prim aradığımızı ve bunun üzerine serileştirme maliyetlerinin eklendiğini unutmayın. Tahmin edebileceğiniz gibi bu pahalı olabilir. İlkel türlere (örn. İnt, string, char, byte, vb.) Yapışarak bazı serileştirme yüklerinden kaçınabilirsiniz. Özel nesneler serileştirme ile karşı karşıya kalacaktır. Kullanıcı sakının.
Zack Jannsen

+1 İyi puan. İki kavramla evlenecek bir değişiklik, bu özel "oturum" sınıfındaki her özelliğin oturumdaki büyük bir nesne yerine asp.net oturumunun kendisini çağırması olacaktır. @ M4N'in yaklaşımından kaçınan tipte döküm yapmak zorundasınız, ancak her seferinde sadece bazı oturumları okursanız buna değebilir.
eol

12

Benimkinden önce verilen cevaplar soruna uygun çözümler sunuyor, ancak bu hatanın neden ortaya çıktığını anlamanın önemli olduğunu düşünüyorum:

SessionMalı Pagetipi bir örneğini verir HttpSessionState, söz konusu isteğe bağlı olarak kullanılabilir. Page.Sessionaslında aramaya eşdeğerdirPage.Context.Session .

MSDN bunun nasıl mümkün olduğunu açıklıyor:

ASP.NET sayfaları ( HttpContextsınıfı içeren ) System.Web ad alanına varsayılan başvuru içerdiğinden HttpContext, tam nitelikli sınıf başvurusu olmadan .aspx sayfasındaki üyelere başvurabilirsiniz HttpContext.

Ancak, App_Code içindeki bir sınıf içinde bu özelliğe erişmeye çalıştığınızda, sınıfınız Page Class'tan türetmedikçe özellik sizin için kullanılamaz.

Bu sık karşılaşılan senaryoya benim çözüm , sınıflara asla sayfa nesneleri geçirmektir . Ben gerekli oturum sayfası oturum gerekli nesneleri ayıklamak ve duruma bağlı olarak, bir ad-değer toplama / Dizi / Liste şeklinde sınıfa geçirmek istiyorum.


Bu harika bir açıklama, bunun için +1 bana yardımcı oldu :)
Owais Qureshi

1

Özel bir Session sınıfındaki oturum değişkenlerini değiştirmeye çalıştığım için aynı hatayla karşılaştım.

Mevcut bağlamı (system.web.httpcontext.current) sınıfa geçirmek zorunda kaldım ve sonra her şey yolunda gitti.

MA


1

Asp.net çekirdeğinde bu farklı çalışır:

public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}

Kaynak: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/


0

Bu hem uygulama hem de geliştirici için daha verimli olmalıdır.

Web projenize aşağıdaki sınıfı ekleyin:

/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
    HttpContext.Current.Session[sessionName] = value;
}

protected internal static T Get<T>(string sessionName)
{
    return (T)HttpContext.Current.Session[sessionName];
}

public static int? WhatEverSessionVariableYouWantToHold
{
    get
    {
        return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
    }
    set
    {
        Save(nameof(WhatEverSessionVariableYouWantToHold), value);
    }
}

}

İşte uygulama:

SessionCentralized.WhatEverSessionVariableYouWantToHold = id;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.