ASP.NET MVC 4 uygulamasında oturumlar nasıl kullanılır?


113

ASP.NET MVC'de yeniyim. PHP'yi daha önce kullandım ve mevcut oturum değişkenlerine göre bir oturum oluşturmak ve kullanıcı kayıtlarını seçmek kolaydı.

C # ASP.NET MVC 4 uygulamamda oturumları nasıl oluşturup kullanacağımı bana gösterebilecek basit bir adım adım öğretici için İnternet'in her yerine baktım. Denetleyicilerimin herhangi bir yerinden erişebileceğim kullanıcı değişkenleri ile bir oturum oluşturmak ve değişkenleri LINQ sorgularımda kullanabilmek istiyorum.



Yanıtlar:


160

Deneyin

//adding data to session
//assuming the method below will return list of Products

var products=Db.GetProducts();

//Store the products to a session

Session["products"]=products;

//To get what you have stored to a session

var products=Session["products"] as List<Product>;

//to clear the session value

Session["products"]=null;

3
Teşekkürler Jobert! bana bir fikir verdin! sadece merak ediyorum .., oturum açma sırasında bir oturuma kullanıcı değişkenleri eklemek mümkün mü? ve ayrıca uygulamamdaki farklı denetleyicilerde oturum değişkenlerine (yalnızca bir kez oluşturulan) erişebilecek miyim?
Thuto Paul Gaotingwe

31
Bir oturumda herhangi bir türden herhangi bir veriyi saklayabilirsiniz. Oluşturulduktan sonra, tüm görünümler ve denetleyicilerde depolanan değere erişebilirsiniz. Ayrıca, oluşturulan oturumun yalnızca kullanıcı ve tarayıcı başına erişilebilir olduğunu unutmayın. Yani, Firefox kullanılarak Kullanıcı1 tarafından oluşturulan oturuma aynı kullanıcı tarafından IE kullanılarak erişilemez. Seans ile yapmamanız gereken şeyler de var. Üzerinde büyük veri depolamayın. Bu, sunucunuzun performansını yavaşlatabilir. Son olarak, Şifre veya Kredi kartı numarası gibi bir oturumda hassas verileri
SAKLAMAYIN

2
Tekrar teşekkürler! Farklı denetleyiciler arasında erişebilmek için onu nerede oluşturabilirim?
Thuto Paul Gaotingwe

2
@JobertEnamno, gelen değeri WebSecurity.CurrentUserIdveri tabanından birden çok kez çekmemesi için saklamak güvenli mi (çok maliyetli buldum)?
Andrius Naruševičius

2
Eğer örneğin, başka bir denetleyici istediğinde hiçbir çapraz kontrolör oturumu vardır Account/LogOniçin Home/Index, Session["FirstName"]olduğu null. Geliştiricilerin bir üst denetleyici ( BaseController) oluşturmaları ve internal protected HttpSessionStateBase SharedSessiontüm alt denetleyicilerde paylaşılan Oturum değişkenini açığa çıkarabilecek korumalı bir alan ( ) tanımlamaları gerekir (bu, tüm uygulama denetleyicilerinizin şu tarihten devraldığını varsayar BaseController)
Bellash

63

Web'in durumsuz doğası nedeniyle, oturumlar, nesneleri serileştirerek ve bir oturumda depolayarak istekler arasında kalıcı olarak kalmanın son derece yararlı bir yoludur.

Bunun mükemmel bir kullanım örneği, uygulamanız genelinde düzenli bilgilere erişmeniz gerektiğinde, her talepte ek veritabanı çağrıları kaydetmeniz gerektiğinde, bu veriler bir nesnede saklanabilir ve her istekte serileştirilmemiş olabilir, örneğin:

Yeniden kullanılabilir, serileştirilebilir nesnemiz:

[Serializable]
public class UserProfileSessionData
{
    public int UserId { get; set; }

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Kullanım durumu:

public class LoginController : Controller {

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            var profileData = new UserProfileSessionData {
                UserId = model.UserId,
                EmailAddress = model.EmailAddress,
                FullName = model.FullName
            }

            this.Session["UserProfile"] = profileData;
        }
    }

    public ActionResult LoggedInStatusMessage()
    {
        var profileData = this.Session["UserProfile"] as UserProfileSessionData;

        /* From here you could output profileData.FullName to a view and
        save yourself unnecessary database calls */
    }

}

Bu nesne bir kez serileştirildikten sonra, onu oluşturmaya veya içindeki veriler için veritabanını yeniden sorgulamaya gerek kalmadan tüm denetleyicilerde kullanabiliriz.

Dependency Injection kullanarak oturum nesnenizi enjekte edin

İdeal bir dünyada, ' bir arabirime programlayıp uygulama yerine programlayacaksınız ' ve serileştirilebilir oturum nesnenizi, tercih ettiğiniz Kontrolün Tersine Çevirme kapsayıcınızı kullanarak denetleyicinize enjekte edersiniz (bu örnek, en aşina olduğum YapıMap'i kullanır. ).

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());   
    }

    public static IUserProfileSessionData GetUserProfileFromSession()
    {
        var session = HttpContext.Current.Session;
        if (session["UserProfile"] != null)
        {
            return session["UserProfile"] as IUserProfileSessionData;
        }

        /* Create new empty session object */
        session["UserProfile"] = new UserProfileSessionData();

        return session["UserProfile"] as IUserProfileSessionData;
    }
}

Daha sonra bunu Global.asax.csdosyanıza kaydedersiniz.

Oturum nesnelerini enjekte etmeye aşina olmayanlar için, burada konu hakkında daha derinlemesine bir blog yazısı bulabilirsiniz .

Uyarı kelimesi:

Seansların minimumda tutulması gerektiğini, büyük seansların performans sorunlarına neden olabileceğini belirtmek gerekir.

Ayrıca herhangi bir hassas veriyi (şifreler vb.) Saklamamanız önerilir.


Yine de sınıf tanımını nereye koyarsınız? Hala her şeyde oldukça yeniyim, ancak diğer denetleyicilerin sınıfı nasıl göreceğini ve ne olduğunu nasıl bileceğini merak ediyorum. Sadece kontrol cihazının üstüne mi ekliyorsunuz? Global.asax'ta SessionStart'ı düşünüyordum, bir şeyleri başlatırdım ama belki de bunu yapmanın en iyi yolu bu değil.
Shaun314

@ Shaun314 İdeal olarak, bağımlılık enjeksiyonu yoluyla nesneyi kontrol cihazınıza enjekte etmek için bir IoC konteyneri kullanırsınız (düzenlemeye bakın).
Joseph Woodward

1
Kullanıcı Kimlik 2'yi kullanarak oturum açtıktan sonra bazı oturum bilgilerini saklıyorum. Bu bilgileri, kullanıcıyı yeniden yönlendirdiğim ilk eylem dışında başka eylemlerde ve denetleyicilerde alamıyorum. Herhangi bir fikir?
Akbari

17

ASP.NET ve ASP.NET MVC'de oturum durumu şu şekilde çalışır:

ASP.NET Oturum Durumuna Genel Bakış

Temel olarak, bunu Session nesnesinde bir değer depolamak için yaparsınız:

Session["FirstName"] = FirstNameTextBox.Text;

Değeri almak için:

var firstName = Session["FirstName"];

10
Çapraz denetleyiciler oturumu yoktur, bu nedenle başka bir denetleyiciyi talep ettiğinizde, örneğin Accountto - HomeOturum ["Ad"] null olur. Geliştiriciler, tüm alt denetleyicilerde paylaşılan değişkeni açığa çıkarabilecek BaseControllerbir korumalı alan ( internal protected HttpSessionStateBase SharedSession) oluşturmalı ve tanımlamalıdır Session(bu, tüm uygulama denetleyicilerinizin bunu miras aldığını varsayar BaseController)
Bellash

4
Eminim var mı? Denetleyicide bir Oturum değişkeni vardır (MVC tarafından sağlanan temel denetleyici).
aeliusd

7
@Bellash bu tamamen yanlış. Oturumlar denetleyiciler arasında kullanılabilir Sadece HomeController'da Session ["test"] ayarladım ve ardından AccountController'ımda okudum.
niico

0

Şunları kullanarak bir oturumda her türlü veriyi depolayabilirsiniz:

Session["VariableName"]=value;

Bu değişken 20 dakika kadar sürecek.


-8

Oturum ["FirstName"] = FirstNameTextBox.Text gibi herhangi bir değeri oturumda saklayabilirsiniz; ama u modelde statik alan olarak almanızı öneririm, ona değer atayın ve bu alan değerine uygulamanın herhangi bir yerinden erişebilirsiniz. Seansa ihtiyacın yok. oturumdan kaçınılmalıdır.

public class Employee
{
   public int UserId { get; set; }
   public string EmailAddress { get; set; }
   public static string FullName { get; set; }
}

denetleyicide - Employee.FullName = "ABC"; Artık bu tam Ada uygulamada herhangi bir yerden erişebilirsiniz.


10
Verilerin, özellikle Çalışan adı gibi kullanıcı verilerinin statik alanlarda depolanması, çok kullanıcılı ortamlarda ciddi sorunlara neden olacaktır. Sistemde iki farklı kullanıcı oturum açtığında, Employee üzerindeki statik alan her örnek için aynı olduğundan aynı Employee.EmailAddress öğesini göreceklerdir.
Gökçer Gökdal
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.