blog

Asp.NET Core MVC Session

Herkese merhaba;

Bugünkü konumuz Asp.NET Core MVC uyugulamalarında Session kullanımı. Bu konuya geçmende önce session nedir ve neden böyle bir bilşene ihtiyaç duyulmaktadır sorularını cevaplamaya çalışalım.

Bunun için öncelikle world-wide-web (www) ortamında gerçekleştirilen haberleşmelerin nasıl yapıldığını bilmemiz  gerekiyor. Temeli 1989 yılında atılan www, istemci ve sunucular arasında HTTP adı verilen bir protokol üzerinden gerçekleştirilen haberleşmelerden oluşmaktadır.

Http Protokolü

HTTP protokolü metin tabanlı bir protokol olup, istemci ve sunucuların birbirleri arasında istek ve yanıtlar göndermesi ile gerçekleştirilmektedir. HTTP protokolü statelss yani durum bilgisi içermeyen bir protokoldür. Normal şartlar altında yapılan istekler ve bu isteklere verilen cevaplar anlıktır ve geçmişe dönük herhangi bir kayıt tutulmaz.

State

State (durum bilgisi), sunucunun istemciyi tanımasında, yetkilendirmesinde yada istek-cevap zincirinde hangi halkada olduğunu anlamasında kullanacağı, uygulamanın türü ve gereksinimlerine göre değişiklik gösterecek bilgilerden oluşmaktadır.

Bu bilgiler normal şartlarda saklanmadığı için, sunucu her isteğe ilk istek, her istemciye de bir yabancı gibi davranmak zorunda kalmaktadır. Bu sorunun aşılması için sunucularda, istemcileri ayırt ederek, onları tanımayı sağlamak amacı ile state (durum) bilgisi tutulması sağlanmalıdır.

State yapısı genellikle, sunucu üzerinde istemci ile ilgili bilgilerin belirli bir süre zarfında erişilebilecek bir şekilde tutulurken, istemcilere de tutulan bu bilgiler ile eşletirmeyi sağlamak amacı ile benzersiz bir id verilmesi ve bu id değerinin istemci tarafında saklanarak, yapılan isteklere eklenmesi mantığı ile kurulmaktadır. 

Asp.NET Core Session Kullanımı

Yukarıda belirttiğimiz state sorunun çözümü için Asp.NET Core'da kullanılabilecek yöntemlerden bir tanesi Session (oturum) mekanizmasıdır.

Asp.NET Core session; istemcilere cookie içerisinde saklanan bir session id verilmesi ve bu id'ye karşılık gelen bilgilerin de sunucu üzerinde tutulması ile yönetilmektedir. Sunucu, istemciye ait session bilgilerini farklı yöntemler ile saklayabilmekte olup, bu yazımızda bu yöntemlerden bir tanesi olan distributed memory cache yapısı ile session anlatılacaktır.

Asp.NET Core öncesinde kullanılmakta olan standar Asp.NET içinde Session varsayılan olarak kullanıma hazır bir yapıda gelmekte iken, Asp.NET Core için bu yapının elle kurulması gerekmektedir.

 

1) Öncelikle bu yazımızda belirtildiği gibi boş bir Asp.NET Core MVC projesi olşturalım.

2) Aşağıda belirtilen Nuget paketini yükleyelim.

Install-Package Microsoft.AspNetCore.Session -Version 2.2.0

3) Startup.cs dosyasını açarak aşağıdaki gibi değiştirelim:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
 
        services.AddDistributedMemoryCache();
 
        services.AddSession(options =>
        {
            options.Cookie.Name = ".aspnetcore.session";
            options.Cookie.Path = "/";
            options.Cookie.HttpOnly = true;             
            options.Cookie.IsEssential = false;
            options.Cookie.SameSite = SameSiteMode.Lax;
            options.IdleTimeout = TimeSpan.FromMinutes(10);
        });
 
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<IHttpContextAccessorHttpContextAccessor>();     }     public void Configure(IApplicationBuilder appIHostingEnvironment env)     {         app.UseCookiePolicy();         app.UseSession();         app.UseMvcWithDefaultRoute();     } }

Burada özellikle Configure metodunda, session çağrısının Mvc çağrısından önce yapıldığından emin olmamız gerekiyor.

4) Session değerlerine Controller içinden erişebilmek için aşağıdaki using direktifini ekleyelim. Belirtilen namespace bize Set... extension metodlarını kullanım imkanı sağlayacak. 

using Microsoft.AspNetCore.Http;

Sonrasında ise session değerlerini aşağıdaki gibi yazıp okuma imkanına kavuşacağız:

public class HomeController : Controller
{
    public IActionResult Index()
    {            
        HttpContext.Session.SetString("key1""value");
        HttpContext.Session.SetInt32("key2", 1);
        HttpContext.Session.Set("key3"new byte[1] { 0 });
 
        string sessionValue1 = HttpContext.Session.GetString("key1");
        intsessionValue2 = HttpContext.Session.GetInt32("key2");
        byte[] sessionValue3 = HttpContext.Session.Get("key3");
 
        return View();
    }
}

5) Session değerlerine Controller dışındaki sınıflardan erişebilmek için:

public class MyClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ISession _session;
 
    public MyClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        _session = _httpContextAccessor.HttpContext.Session;
    }
 
    public void ReadSession()
    {
        string sessionValue1 = _session.GetString("key1");
    }
}

Bu sınıfı Controller içinden çağırabilmek için:

public class HomeController : Controller
{
    private readonly IServiceProvider _serviceProvider;
    public HomeController(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }
 
    public IActionResult Index()
    {             
        IHttpContextAccessor acc = _serviceProvider.GetService<IHttpContextAccessor>();
 
        MyClass c = new MyClass(_serviceProvider.GetService<IHttpContextAccessor>());
        c.ReadSession();
 
        return View();
    }
}

IServiceProvide sınıfının GetService extension metodunun kullanılabilmesi için aşağıdaki using direktifinin Controller sınıfımıza dahil edilmesi gerekiyor:

using Microsoft.Extensions.DependencyInjection;

6) Session değerlerine View içinden erişebilmek için:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor httpContextAccessor
 
@httpContextAccessor.HttpContext.Session.GetString("key1")

 

Yukarıdaki örneklerden de görüleceği gibi, varsayılan olarak Session yapısında, String, Int32 ya da Byte[] tutulabilmektedir. Ancak Session içinde conmplex sınıfların da tutulması isteniyor ise aşağıdaki gibi bir extension metodu yazılarak, nesnelerin serileştirilmiş hallerinin de String olarak sessionda tutulması ve bu serileştirilmiş Stringlerden istenildiğinde session üzerinden nesne olarak okunması sağlanabilecektir.

using Newtonsoft.Json;
public static class SessionExtension
{
    public static void Set<T>(this ISession sessionstring keyT value)
    {
        session.SetString(keyJsonConvert.SerializeObject(value));
    }
 
    public static T Get<T>(this ISession sessionstring key)
    {
        var value = session.GetString(key);
 
        return value == null ? default(T) :
            JsonConvert.DeserializeObject<T>(value);
    }
}

Örnek kullanımı:

public IActionResult Index()
{            
    MyClass c = new MyClass(); 
    HttpContext.Session.Set<MyClass>("key"c);
 
    return View();
}

Bu yazımızda Sess,on verilerini DistributedMemoryCache ortamında tuttuk. Bunun yanında veritabanı ya da redis gibi ortamlarda dasession tutabiliriz. Bu konuları da ilerleyen yazılarımızda ele alacağız.

 

 

 

 

 

 

 

 

 

Emre Mumcu

info

About this post

This post is created / summarised by it professionals having deep understanding about the subject. It is simplified and clarified to make the content clear & easy to understand. It may not cover all the necessary key points. It may include content from external resources. Please check references is exists.

mumcu.net © 2019

Copyright © All rights reserved | This template is made with by Colorlib