ASP.NET Core MVC State Management Bölüm-2
  1. Anasayfa
  2. ASP.Net

ASP.NET Core MVC State Management Bölüm-2

0

Bir önceki yazımın devamı olan bu bölüm içerisinde, sizlere Session State nedir ve kullanımı hakkında bilgiler veriyor olacağım.

Session

SessionState, kullanıcı uygulama üzerinde işlem yaparken veya gezinirken kullanıcı verilerini depolamamıza yarayan bir durum yönetim nesnesidir. Bir istemciden gelen istekler arasında veriyi tutabilmek için uygulama tarafında tutulur. Bilgilere ulaşmak için sessionId üzerinden hareket edilir. Kullanıcı her bir istekte, SessionID değeri sunucuya gönderilir o değere ait bilgiler sunucu üzerinden alınır ve işlemler devam eder. Session’ın bilgisinin silinmesi için, kullanıcının browser’ı kapatması veya uygulama üzerinde sonlandırılması gibi işlemlerle silinmesi sağlanabilir. Default olarak session’ın ne kadar süre duracağına uygulama üzerinden’de karar verilebilir.

Asp.Net Core, istemciye bir oturum bilgisi(sessionId) içeren bir çerez(cookie) ekler ve oturum süresince işlem yapabilmek için bu değere ihtiyaç duyar. Tarayıcı cookie içerisinde yer alan SessionID ile her istekle birlikte uygulamaya gönderir. Uygulama üzerinde istemciye ait bilgileri alabilmek için bu değeri kullanır.

Session ile çalışırken bilmemiz gerekenler;

  • SessionId değeri oturum açtığınız browser’a özgüdür. Farklı bir browser’da oturum açtığınızda size farklı bir SessionId değeri verilecektir.
  • Browser (tarayıcı) kapattığınızda oturum sonlandırılacaktır.
  • Oturum süresi dolmuş ise, uygulama yeni bir yeni bir oturum oluşturur.
  • Uygulama açıldıktan sonra en son yapılan istekten sonra belirli bir süre oturumu tutmaya devam eder. Default olarak belirlenmiş zaman aşımı süresi 20dakikadır. Bu değeri uygulama üzerinden değiştirebilirsiniz.
  • Oturum kapandığında üzerinde tutulan tüm veriler silinecektir. Kalıcı depolama yöntemi değildir. Hassas bilgiler tutulmamalıdır.

Bir proje üzerinden nasıl kullanıldığını beraber inceleyelim.

Sırası ile komutlarımız,

  1. cd Desktop => ilgili dizinimizi masaüstü olarak ayarlıyalım.
  2. mkdir StateManagement => StatManagement adında bir klasör oluşturalım
  3. cd StateManagement => dizin olarak, oluşturduğumuz klasörü belirleyelim
  4. dotnet new mvc -n SessionApp -f netcoreapp3.1 => dotnet cli komutlarını kullanarak 3.1 versiyonu ile yeni bir mvc projesi oluşturuyoruz.
  5. cd SessionApp => dizinimizi proje ana dizini olarak belirliyoruz.
  6. code . => code(boşluk).(nokta) diyerek vscode’u proje dizininde açıyoruz.

Projemiz içerisinde session kullanabilmemiz için öncelikle kütüphaneyi indirmemiz gerekecek. Bunun için VSCode üzerindeki terminali kullanabilirsiniz veya command promp üzerinden de devam edebilirsiniz. dotnet cli komutlarını çalıştırabilmeniz için dikkat etmeniz gereken projenin ana dizini içerisinde olduğunuzdan emin olmanızdır. dir (directory) anahtar kelimesini yazıp komutu çalıştırdığınızda Program.cs dosyasını görüyor olmanız gerekir.

Resim – 1

Eğer doğru dizin içerisinde değilseniz cd komutunu kullanarak ilgili dizine geliniz.

Projemiz içerisinde Session kullanmak için indirmemiz gereken cli komutu:

dotnet add package Microsoft.AspNetCore.Session –version 2.2.0

komut ekranı üzerinde bu komut satırına yapıştırıp enter tuşuna basmanız yeterli olacaktır. Pakek indirim sürecini tamamladıktan sonra, bunu kullanabilmemiz için tanımlama Startup.cs içerisine geliniz ve aşşağıdaki gibi düzenleyiniz.

Resim – 2

Resim – 3

Yukarıdaki genel ayarlarımızı yaptıktan sonra hızlıca uygulamamıza geçelim. HomeController içerisine geliniz ve aşşağıdaki gibi düzenleyiniz:

using Microsoft.AspNetCore.Mvc;

using Microsoft.AspNetCore.Http;

namespace SessionApp.Controllers

{

    public class HomeController : Controller

    {

        private static readonly string SESSION_KEY_FULLNAME = “fullname”;

        private static readonly string SESSION_KEY_AGE = “age”;

        public IActionResult Index()

{

            return View();

        }

        public IActionResult Set()

        {


// aynı key değerine sahip oturum içerisinde session var ise, eşitleme yapmayacaktır.

            if (string.IsNullOrWhiteSpace(HttpContext.Session.GetString(SESSION_KEY_FULLNAME)))

            {

// eğer session içerisinde string bir değer tutacaksanız, SetString

                HttpContext.Session.SetString(SESSION_KEY_FULLNAME, “muratvuranok”);

            }


// aynı key değerine sahip oturum içerisinde session var ise, eşitleme yapmayacaktır.

            if (string.IsNullOrWhiteSpace(HttpContext.Session.GetString(SESSION_KEY_AGE)))

            {

// sayılsal bir değer tutacaksanız(int32) SetInt32 metotlarını kullanmanız yeterli olacaktır.

                HttpContext.Session.SetInt32(SESSION_KEY_AGE, 100);

            }

            return View(nameof(Index));

        }

    }

}

Yukarıda yaptığımız işlem, homecontroller içerisindeki Set action’ı tetiklediğimizde, kullanıcı için oluşmuş olan session için değer ataması yaptık. Eklediğimiz bu değerleri farklı bir action içerisinde görüntülemek için, yeni bir ActionResult oluşturalım ve aşşağıdaki gibi düzenleyelim.

public IActionResult Get()

{

        StringBuilder sb = new StringBuilder();

        if (!string.IsNullOrWhiteSpace(HttpContext.Session.GetString(SESSION_KEY_FULLNAME)))

        {

              sb.Append($”<h1 class=’display-4 text-center’> Kullanıcın Adı : {HttpContext.Session.GetString(SESSION_KEY_FULLNAME)} </h1>”);

        }

        if (!string.IsNullOrWhiteSpace(HttpContext.Session.GetString(SESSION_KEY_AGE)))

        {

              sb.Append($”<h1 class=’display-4 text-center’>Kullanıcı Yaşı : {HttpContext.Session.GetInt32(SESSION_KEY_AGE)}</h1>”);

        }

        var template = new HtmlString(sb.ToString());

        return View(viewName: nameof(Index), model: sb is null ?  null : template);

}

Daha sonrasında ise , Index view’ına gelip düzenleme yapalım, daha sonra kullanacağımız bölümler olacağından Index’in içerisini aşşağıdaki gibi düzenleyelim.


<div class=“row mt-5 shadow-sm”>

    <div class=“col”>

        <h1 class=“display-4 text-center”>Session</h1>

        <hr />

        <p>Session’a değer eklemek için, lütfen                   <a asp-action=“set”>tıklayınız!</a></p>

        <p>Session değerlerini görmek için, lütfen                <a asp-action=“get”>tıklayınız!</a></p>

        <hr />

        <p>Extention Session’a değer eklemek için, lütfen         <a asp-action=“setextention”>tıklayınız!</a></p>

        <p>Extention Session değerlerini görmek için, lütfen      <a asp-action=“getextention”>tıklayınız!</a></p>

        <hr />

        <p>SESSION_KEY_FULLNAME değerini temizlemek için, lütfen  <a asp-action=“clear” class=“text-danger”  asp-route-id=“fullname”>tıklayınız!</a></p>

        <p>SESSION_KEY_AGE değerini temizlemek için, lütfen       <a asp-action=“clear” class=“text-danger”  asp-route-id=“age”>tıklayınız!</a></p>

        <p>Extention değerini temizlemek için, lütfen             <a asp-action=“clear” class=“text-danger”  asp-route-id=“employees”>tıklayınız!</a></p>

    </div>

</div>

@if (Model != null)

{

    <div class=“row mt-5 shadow-sm”>

        <div class=“col”>

            @*

                @Html.Raw(Model)

                controller içerisinden gönderdiğiniz, string html tasarımı ekranda html çıktısı olarak gösterir. Biz controller içerisinden HtmlString gönderdiğimizden ihtiyacımız olmayacaktır.

            *@

            @Model

        </div>

    </div>

}

Ekran çıktısı :

Resim – 4

Projemizin ana dizinindeyken dotnet watch run komutu ile projemizi çalıştıralım ve ilk butona tıklayıp session’a değer ataması yapalım. İşlem sonunda değeri görmen için 2. Butona tıklamanız yeterli olacaktır. Ekran çıktısı aşşağıdaki gibi olmalıdır.

Resim – 5

Yukarıda bahsettiğimiz gibi, session’ın sona ermesi için browser’ı kapatmanız veya istekte bulunmadan 20dk geçirmeniz gerekiyor. Session’ın ne zaman sonlanacağını siz belirlemek istiyorsanız Startup.cs içerisinde ufak bir değişiklik yapmamız yeterli olacaktır. Startup.cs içerisine gelerek aşşağıdaki düzenlemeleri yapalım. ConfigureService içerisine eklemiş olduğumuz services.AddSession() bölümünü aşşağıdaki gibi değiştiriniz.


public void ConfigureServices(IServiceCollection services)

{

      services.AddSession(options => {

          options.Cookie.Name = “mshowto”;

      });

     services.AddControllersWithViews();

}

Bu işlem sonucunu browser üzerinde görelim.

Resim – 6

Yukarıda gördüğünüz gibi, session için oluşan cookie dosyasının adını değiştirip düzenleyebiliryoruz. Diğer ayarlarımızı eklemeye devam edelim.

public void ConfigureServices(IServiceCollection services)

{

        services.AddSession(options => {

         options.Cookie.Name = “mshowto”;

         options.IdleTimeout = TimeSpan.FromMinutes(2);

        });

        services.AddControllersWithViews();

}

IdleTimeout  : uygulama içerisinde oluşan session değerinin ne kadarlık bir süre yaşayacağını belirleyebilirsiniz. Burda TimeSpan içerisinde yer alan metotlara kullanarak zaman belirtebilirsiniz. Bizim tanımlamamıza göre session proje açıkken eğer 2dk süresince işlem yapmazsanız yani herhangi bir istekte bulunmazsanız oturum kapanacaktır. Oturum kapandığında Cookie’de değeriniz durmaya devam edecektir. Yeni bir istekte bulunduğunuzda aynı değerle size sunucu tarafında yeni bir oturum açılacaktır.

Proje içerisinde var olan session’ları silmemiz gerekebilir. Bunu yapabilmek için 2 farklı yöntem kullanabilirsiniz.

  1. Clear (tüm session’ları siler)
  2. Remove (parametrede gönderdiğiniz anahtar kelimeye göre siler)

Bu konuyu hemen örneklendirmek için, home controller içerisine Clear adında string parameter alan yeni bir action ekliyoruz.

public IActionResult Clear(string id)

{

     // verdiğiniz, key değerine göre session’ı siler.

     HttpContext.Session.Remove(id);

     // kullanıcıya ait, tüm session’ları siler.

     //HttpContext.Session.Clear();

     return View(nameof(Index));

}

Tasarım içerisinde yer alan slime butonlarından ilgili butona tıkladığınızda session kalıcı olarak silinmiş olacaktır. Tekrar session değerlerini getir dediğinizde o değerin gelmediğini göreceksiniz. Buraya kadar işler kolay, string gönder string al, int32 gönder int32 al olarak devam ediyor. Peki model olarak bir class veya bir class listesi göndermek istersek durum nasıl işliyor. Bunun için öncelikle Model içerisin Employee sınıfı ekleyelim ve içeriğini aşşağıdaki gibi düzenleyelim.

namespace StateManagament.SessionState_.Models

{

    using System;

    public class Employee

    {

        public Employee()

        {

            this.Id = Guid.NewGuid();

            this.CreatedDate = DateTime.Now;

        }

        public Guid Id { get; }

        public string FirstName { getset; }

        public string LastName { getset; }

        public DateTime CreatedDate { get; }

    }

}

Model üzerinde işimiz bittikten sonra proje içerisine Helper adında bir klasör ekleyiniz ve içerisine SessionHelperExtention adında bir class Ekleyiniz ve aşşağıdaki gibi düzenleyiniz.

namespace StateManagament.SessionState_.Helper

{

    using Microsoft.AspNetCore.Http;

    using System.Text.Json;

    public static class SessionHelperExtensions

    {

        public static void Set<T>(this ISession session, string key, T value)

        {

            session.SetString(key, JsonSerializer.Serialize(value));

        }

        public static T Get<T>(this ISession session, string key)

        {

            var value = session.GetString(key);

            return value == null ? default : JsonSerializer.Deserialize<T>(value);

        }

    }

}

Yukarıda yer alan 2 metot extention metot(sondan eklemeli, genişletilebilir) metot olabilmesi için sınıf static olarak işaretlenmiştir. Metotlar Generic olduğundan istediğiniz tip’de değer gönderebilirsiniz ve o tip değerine göre verileri geri alabilirsiniz. Gönderdiğiniz değerler session içerisinde Json nesnesi olarak tutulup geri aldığınızda ise C# nesnesine çevrilmektedir.

Kullanım için HomeController içerisine gelelim ve 2 adet Action yazalım.

Öncelikle HomeController içerisinde static olarak belirlediğimiz key değerlerimize yenisini ekleyelim.

private readonly static string SESSION_KEY_EMPLOYEES = “employees”;

Sonrasında değerlerimizi set edebilmemiz için aşşağıdaki gibi SetExtention Action’ı aşşağıdaki gibi düzenleyelim.

public IActionResult SetExtention()

{

   if (HttpContext.Session.Get<List<Employee>>(SESSION_KEY_EMPLOYEES) == default)

   {

      var employees = new List<Employee>

     {

        new Employee{ FirstName = “Murat”,  LastName = “Vuranok”},

            new Employee{ FirstName = “Ahmet”,  LastName = “Şahin”},

            new Employee{ FirstName = “Mehmet”, LastName = “Şahin”}

       };

        HttpContext.Session.Set<List<Employee>>(SESSION_KEY_EMPLOYEES, employees);

    }


return View(nameof(Index));

}

Set bölümünü bitirdikten sonra Get tarafını düzenleyelim. Metin birleştirme İşlemleri için, StringBuilder sınıfından faydalanıyoruz. En hızlı ve performanslı şekli.

public IActionResult GetExtention()

{

    if (HttpContext.Session.Get<List<Employee>>(SESSION_KEY_EMPLOYEES) != default)

    {

        StringBuilder sb = new StringBuilder();

      sb.Append(“<table class=’table mt-5′><thead><tr><th>Id</th><th>Adı</th><th>Soyadı</th><th>Tarih</th></tr></thead><tbody>”);

        foreach (Employee employee in HttpContext.Session.Get<List<Employee>>(SESSION_KEY_EMPLOYEES))

        {

            sb.Append($”<tr><td>{employee.Id}</td><td>{employee.FirstName}</td><td>{employee.LastName}</td><td>{employee.CreatedDate}</td></tr>”);

        }

       sb.Append(“</tbody></table>”);

        var template = new HtmlString(sb.ToString());

        return View(viewName: nameof(Index), model: template);

    }

  return View(viewName: nameof(Index));

}

Bu işlemlerimiz bittikten sonra, ilgili butonlara tıklayarak, işlem sonucunu görüntüleyebiliriz. Ekran çıktısı aşşağıdaki gibi görünecektir.

Resim – 7

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs: ASP.NET Core MVC State, MVC State, .NET Core

Bu İçeriğe Tepkin Ne Oldu?
  • 14
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 1
    _ok_iyi
    Çok iyi
  • 2
    sevdim_
    Sevdim!
  • 1
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

1982 Ankara doğumluyum, Lise ve Üniversite Eğitimini Açık Öğretim üzerinden tamamladım ve 2009 yılında BilgeAdam ile yazılım hayatına atıldım Öğrenci olarak başladığım kurumda 2009 yılından bu yana farklı görevlerde çalıştım. Şuan Bilgeadam beşiktaş şubesinde aktif olarak danışmanlık ve yazılım eğitmenliği yapmaktayım. Yeni teknolojileri araştırıp öğrenmeyi seven biriyim. İşim gereği hem geliştirdiğim projeler olsun eğitim verdiğim öğrenciler olsun aktif olarak kendimi güncel tutmak işimin gereği ve bu bildiklerimi paylaşmaktan mutluluk duyuyorum.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir