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

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

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

-Şimdiden teşekkürler!

Çözüm

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;

//to clear the session value

Session["products"]=null;
Yorumlar (9)

Web'in durumsuz doğası nedeniyle oturumlar, nesneleri serileştirip bir oturumda saklayarak istekler arasında kalıcı hale getirmenin son derece kullanışlı bir yoludur.

Bunun mükemmel bir kullanım örneği, uygulamanız genelinde düzenli bilgilere erişmeniz gerekiyorsa, her istekte ek veritabanı çağrılarından tasarruf etmek için bu veriler bir nesnede saklanabilir ve her istekte bu şekilde serileştirilebilir:

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 serileştirildikten sonra, onu oluşturmaya veya içindeki veriler için veritabanını tekrar sorgulamaya gerek kalmadan tüm denetleyicilerde kullanabiliriz.

Dependency Injection kullanarak oturum nesnenizi enjekte edin

İdeal bir dünyada 'bir arayüze programlayın, uygulamaya değil' ve serileştirilebilir oturum nesnenizi, seçtiğiniz Inversion of Control kapsayıcınızı kullanarak denetleyicinize enjekte edersiniz (bu örnekte StructureMap kullanıldı, çünkü benim en aşina olduğum bu).

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For().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.cs dosyanıza kaydedersiniz.

Oturum nesnelerinin enjekte edilmesine aşina olmayanlar için konuyla ilgili daha ayrıntılı bir blog yazısı bulabilirsiniz burada.

Bir uyarı:

Oturumların minimumda tutulması gerektiğini belirtmek gerekir, büyük oturumlar performans sorunlarına neden olmaya başlayabilir.

Ayrıca, içlerinde herhangi bir hassas veri (şifreler vb.) saklamamanız önerilir.

Yorumlar (3)

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

ASP.NET Oturum Durumuna Genel Bakış

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

Session["FirstName"] = FirstNameTextBox.Text;

Değeri almak için:

var firstName = Session["FirstName"];
Yorumlar (3)