.Net Core’ da Session Yönetimi

Hamza TAŞ
5 min readJan 17, 2021

--

.Net Core da…. şeklinde başlayan ve devam edecek olan bir blog serisi başlatmak istedim. Bu şekilde isimlendirmemin sebebi ise bir şey arattığımız zaman şu framework’ta veya şu dilde nasıl yapılır sorusunu Google’a sorma alışkanlığımızı devam ettirmek oldu. Daha önceki .Net versiyonlarında yayınlanan her versiyon bir sonrakinin devamı oldu. Fakat .Net Core duyurulduğunda .Net geliştiriciler neye uğradığını şaşırdı ve bir önceki versiyonlardan tamamen bağımsız açık kaynak kodlu her platforma çalışabilen yapıda olması .Net Geliştiricilerin tectubeli olduğu alanlar değildi. Bu nedenle .Net Core öğrenmek isten bir çok .Net geliştici .Net Core’da şu/bu... nasıl yapılır ? sorusunu sormaya başladı.

Belki daha basit bir konudan başlanabilirdi ancak çok temel olmayacak olan bir seri olacağı için Session’ın ne olduğunu bilen ve .Net Core’da nasıl uygulandığını öğrenmek isteyenleri buraya alabiliriz. :)

Web uygulama geliştirme tecrubesi olan herkes hemen hemen Framework veya geliştirme dili farketmeksizin Session ile uğraşmıştır fakat Session yapısının uygulamaya implemente edilmesi her framework ve geliştirme ortamı için farklılık göstermiştir. Core projelerinde de Sessionı uygulamaya implemente edilmesi diğer dillerde farklılık gösterdiği gibi .Net’in önceki versiyonlarından da farklılık göstermiştir. Bu blog yazısında bu implementasyon işlemini öğreneceğiz.

Session Nedir ?

Her ne kadar tecrübeli kişileri yazıya davet etsek te Session’ın ne olduğunu anlatmadan blog yazımız anlamlı bir bütün oluşturmayacağı için kısaca tanımlamak istedim. Bildiğimiz üzeri Web’de haberleşme HTTP protokolu üzerinden yapılır. HTTP protokulu de durum bilgisi olmayan bir protokoldur. Bu yüzden bir sayfaya bir istek atıldığında her HTTP isteği ayrı bir istek olarak ele alınır. Http’nin bu yapısı nedeniyle gelen isteklerin yönetimini yapmak adına Session diye bir kavram ortaya çıkmıştır. Session kullanıcı verilerini belirli bir süre ile durum bilgisini tutan, key-value şeklinde veri saklayan bir mekanizmadır. Session detaylı olarak farklı bir blog konusu olabilir bu nedenle biz .Net Core da session yapısını incelemeye devam edelim. Core Projelerinde In-Proc (In-Memory) ve Out-Proc(Distrubuted Session) adında 2 tür session vardır. Bu blog yazsında In-Proc yapısını inceliyor olacağız. Farklı bir blog yazsında da Out-Proc yapısını mutlaka inceleyeceğim.

.Net Core’ da Session Nasıl Kullanılır ?

Session yönetimin diğer versiyonlardan farklı olduğunu dile getirmiştik. En büyük fark olarak gözümüze çarpan şey eski .Net versiyonlarında bir nesneyi sessionda tutabiliyorduk ancak .Net Core da tutamıyoruz. Yani Kullanıcı nesnesini olduğu gibi artık Session’a atamıyor olacağız :)

Bir diğer büyük değişim ise Session yapısı .Net Core da default olarak aktif gelmiyor bu nedenle projeye dahil edip http pipeline’a kayıt etmemiz gerekiyor. Bu nedenle işe Microsoft.AspNetCore.Session paketini NuGet Package Manager üzerinden edinmemiz gerekiyor. Aşağıdaki bağlantı üzerinden ulaşabilirsiniz veya Package Maneger ile bir aşağıdaki komut ile projenize bu paketi dahil edebilirsiniz.

Install-Package Microsoft.AspNetCore.Session

Bu işlemi tamamladıktan sonra Startup.cs içerisinde methodu kayıt ettirmemiz gerekmektedir. Bu nedenle Startup.cs içerisinde aşağıdaki şekilde configure method’umuzun içerisinde AddSession() methodumuzu kayıt ediyoruz.

public void ConfigureServices(IServiceCollection services)
{
services.AddSession();
}

Buna alternatif olarak aşağıdaki şekilde bir kullanım yapıp session üzerinde session süresi, Cookie adı gibi çeşitli özellikleri belirleyebiliriz.

public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options => {
options.Cookie.Name = ".DotNetCore.Session";
options.IdleTimeout = TimeSpan.FromMinutes(1);
options.Cookie.IsEssential = true;
});
}

İkinci adım olarak kayıt işleminden sonra Projede Session kullanacağımızı belirtmek için UseSession() Methodunu Canfigure method içerisinde çağırmamız gerekecektir.

public void Configure((IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSession();
}

Bu işlemlerden sonra projemizde session yapısını kullanabilceğiz.

Session’a değer yazma ve okuma

.Net Core da Session’a yazma işlemi 2 method ile yapılabilir. Bunlar SetInt32 ve SetString methodlarıdır. Kullanım şekilleri aşağıdaki gibidir;

HttpContext.Session.SetString("sessionKeyStr", "hamzatas");HttpContext.Session.SetInt32("sessionKeyInt", 100);

Sessiona’a yazılan değer de yine aynı şekilde 2 method ile okunur. Bunlar GetInt32 ve GetString Metotlarıdır.

string _sessionStrValue = HttpContext.Session.GetString("sessionKeyStr");int? _sessionIntValue = HttpContext.Session.GetInt32("sessionKeyInt");

Buraya kadar .Net Core projesinde session kullanmayı öğrendik. Fakat kompleks nesneleri sessionda tutamadığımızı belirtmiştik. Buna çözüm olarak gözümüze ilk çarpan şey sessionda string değer taşıyabiliyoruz ve aklımıza hemen kompleks nesneyi json formatına çevirip bu string veriyi sessiona yazmak geliyor. Öyleyse hemen bu işlemi nasıl yapacağımızı bir örnek üzerinden görelim. İşe bir helper sınıfı yazarak nesneyi json’a çeviren ve json’dan nesneye geri çeviren methodları bu sınıfa ekleyelim.

Yolumuz json ile kesiştiği için öncelikle newtonsoft kütüphanesini projemize dahil ediyoruz. Bunun için NuGet Package Console üzerinden PM ile aşağıdaki komut ile dahil edebilirsiniz. Paketin NuGet adresinide aşağıda paylaşıyorum.

Install-Package Newtonsoft.Json -Version 12.0.3

https://www.nuget.org/packages/Newtonsoft.Json/

Daha sonra aşağıdaki gibi Helper sınıfımızı oluşturuyoruz. Bu sınıf ile sessiondan değer okuyup ve yazma işlemlerini yapacağız.

public static class SessionHelper
{
public static void SetObjectAsJson(this ISession session, string key, object value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T GetObjectFromJson<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
}

Bu sınıfın kullanımı içinde örneğin aşağıdaki gibi bir User nesnemiz olsun ve biz bu nesneyi Session üzerinden set edip kullanmak isteyelim. Bunun için yukarı belirttiğim SetString() ve GetString() methodları kullanacağız.

    public class User
{
public int UserId { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public string Mail { get; set; }
public string Phone { get; set; }
}

Artık nesnemizi aşağıdaki şekilde session’a alıp session’dan okuyabileceğiz.

// Store Complex data in session
List<User> _users = new List<User>()
{
new User()
{
Firstname = "Hamza",
Lastname = "TAŞ",
Mail = "hamzatas@*****.com",
Phone = "05*********",
}
};
// Set data
SessionHelper.SetObjectAsJson(HttpContext.Session,"User", _users);
// Get Data
ViewBag.UserList = SessionHelper.GetObjectFromJson<List<User>>(HttpContext.Session, "User"); ;

Session’dan Değer Silme

Son olarak Session’a aldığımız datayı nasıl silebileceğimizi göreceğiz. Bunun için tek bir key ile Sessionı temizleyebileceğimiz gibi Sessiondaki tüm değerleri silebiliriz. Örneğin bir önceki başlıkta Sessiona aldığımız User nesnesini kullanıcı çıkış yaptığı için temizlemek istersek aşağıdaki şekilde bir Action ile bu datayı Session’dan silebiliriz.

public IActionResult Logout()
{
HttpContext.Session.Remove("User");
return View();
}

Tek bir key için değil tüm değerleri temizlemek istersek te aşağıdaki şekilde bir kullanım yapmamız gerekecektir.

public IActionResult Logout()
{
HttpContext.Session.Clear();
HttpContext.SignOutAsync();
return View();
}

Böylece blog yazımızın sonuna gelmiş bulunuyoruz. Core projelerinde nasıl session’nın kullanıldığını incelemiş olduk. Out-Proc Session yapısını da farklı bir blog yazısı üzerinden ileri ki zamanlarda inceleyeceğim. Bu nedenle takipte kalınız :)

Ek olarak blog yazısındaki örnekleri barındıran .Core Projesini de github hesabıma yükledim. Aşağıdaki url üzerinden ulaşabilirsiniz.

https://github.com/HamzaTas/dotnet-core-app-examples

Keyifli Çalışmalar :)

Kaynaklar

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-5.0

https://www.c-sharpcorner.com/article/how-to-use-session-in-asp-net-core/

https://www.webtrainingroom.com/aspnetcore/session

--

--