.Net Session Provider İçin Redis, .Net web projesi geliştirdiğimizde projenin webconfig dosyasında bir değişiklik yaptığımızda, projeyi yeniden derlediğimizde yada application pool’u yeniden başlattığımızda varolan session’ların yok olması bazen istemediğimiz durumdur örnek oturum bilgilerinin sadece session’da tutulduğunu varsayalım ve her session yenilenmesinde yeniden oturum açmak veya bazı seçimleri tekrar tekrar yapmak can sıkıcı olabiliyor. İşte bu noktada session provider’ımızı ayırmak için no-sql çözümlerinden biri olan redis’i session provider olarak nasıl kullanabileceğimiz noktasına değineceğiz.
.Net Session Provider İçin Redis Kullanma
.Net web projeniz için redis session provider’ı desteği kazandırmak için Microsoft.Web.RedisSessionStateProvider adlı nuget paketini yüklemelisiniz.
Visual Studio İçerisindeki Package Manager Console’dan alttaki komutu çalıştırarak paketin kurulumu sağlayabilirsiniz.
Redis Session State Provider’ paketinin StackExchange.Redis.StrongName adında bir paket bağımlılığı yer alıyor. Eğer bu paket projenizde yoksa bağımlılıkdan dolayı yüklenir.
Paketi kurmanıza rağmen eğer alttaki gibi bir hata alırsanız StackExchange.Redis.StrongName nuget paketini güncellemelisiniz. Paketin kendi dökümanında eğer redis için StackExchange.Redis adlı paketini kullanıyorsanız bu paketi silip daha sonra sessio state provider’ı yüklemeniz öneriliyor.
Could not load file or assembly ‘StackExchange.Redis.StrongName, Version=1.0.316.0, Culture=neutral, PublicKeyToken=c219ff1ca8c2ce46’ or one of its dependencies. The system cannot find the file specified.
Ayrıca nuget paket kurulumu tamamlandıktan sonra web config’e alttakine benzer satırlar eklenecek. MySessionStateStore name’ine sahip sessionState etiketi altındaki providers etiketi altında yer alan add etiketinin attribute’lerinden bazılarında değişiklik yaptık bu değerler ssl değeri default olaral true geliyor biz bunu false yaptık ve port attribute’ü default’da gelmiyor ve default port değeri 6380 ama biz 6379 yapıyoruz. Eğer özel bir ayarlama yapmadıysanız kurduğunuz redis servisi portu 6379 olarak ayarlamış olacaktır ama siz özel bir port belirlediyseniz redis servisi için bu attribute değerinede ayarladığınız portu girmelisiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <sessionState mode="Custom" customProvider="MySessionStateStore"> <providers> <!-- For more details check https://github.com/Azure/aspnet-redis-providers/wiki --> <!-- Either use 'connectionString' OR 'settingsClassName' and 'settingsMethodName' OR use 'host','port','accessKey','ssl','connectionTimeoutInMilliseconds' and 'operationTimeoutInMilliseconds'. --> <!-- 'throwOnError','retryTimeoutInMilliseconds','databaseId' and 'applicationName' can be used with both options. --> <!-- <add name="MySessionStateStore" host = "127.0.0.1" [String] port = "" [number] accessKey = "" [String] ssl = "false" [true|false] throwOnError = "true" [true|false] retryTimeoutInMilliseconds = "5000" [number] databaseId = "0" [number] applicationName = "" [String] connectionTimeoutInMilliseconds = "5000" [number] operationTimeoutInMilliseconds = "1000" [number] connectionString = "<Valid StackExchange.Redis connection string>" [String] settingsClassName = "<Assembly qualified class name that contains settings method specified below. Which basically return 'connectionString' value>" [String] settingsMethodName = "<Settings method should be defined in settingsClass. It should be public, static, does not take any parameters and should have a return type of 'String', which is basically 'connectionString' value.>" [String] loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String] loggingMethodName = "<Logging method should be defined in loggingClass. It should be public, static, does not take any parameters and should have a return type of System.IO.TextWriter.>" [String] redisSerializerType = "<Assembly qualified class name that implements Microsoft.Web.Redis.ISerializer>" [String] /> --> <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" port = "6379" /> </providers> </sessionState> |
Paket kurulumunu .net web projemize yaptıktan sonra redis eğer bilgisayarınızda yoksa o zaman github.com/MSOpenTech/redis/releases adresinden redis kurulum dosyasını indirip gerekli kurulumu yapmalısınız. Yükleme işini isterseniz windows paket yöneticilerinden biri olan Chocolatey üzerinden yüklemek isterseniz alttaki komutu Command Line Interface kullanarak yükleme yapabilirsiniz.
Yükleyeceğiniz bu paket ile bilgisayarınızda herhangi bir arayüze sahip redis aracı bulamayacaksınız sadece işlemlerin CLI üzerinde yürütülebilmesine yardımcı olan bir tool ve bir windows servis kurulduğunu göreceksiniz.
Altta windows servis’e ait örnek görüntüye ulaşabilirsiniz.
Kurulumu yaptıktan sonra servisin çalışığ çalışmadığını cli üzerinden kontrol etmek için redis-server yazıp alttaki gibi örnek çıktıya ulaşabilirsiniz bu çıktıda hangi versiyon redis kurulumu yapıldığı redis-server’ın o anki durumu(başlamış olup olmadığı) redis portunu öğrenebilirsiniz örnek çıktı altta yer almaktadır.
Eğer redis-server yazdığınız komutun tanınmadığı ile ilgili bir uyarı alırsanız C:\Program Files\Redis dizini altındaki redis-cli komut satırı aracı üzerinden işlemlerinizi gerçekleştirebilirsiniz.
Redis key-value yönetimini gui aracı üzerinden yapmak için piyasada kullanabileceğiniz çok fazla tool var ama ben size en basit tool ve ücretsiz olması dolayısıyla Redis Desktop Manager adlı tool’u önericem bu tool’a https://redisdesktop.com/download adresinden ulaşabilirsiniz.
Redis Desktop Manager’ı indirdikten sonra ve makale başındaki redis servis uygulamasını kurduysanız alttaki gibi bağlantı testini başarıyla geçmeniz ve varsayılan olarak gelen veritabanları boş şekilde(ilk defa kuruyorsanız) listelenecektir.
İlgili redis servisini ve GUI tool üzerinden redis veritabanı işlemlerini yapmak için Redis Desktop Manager tool’unu kurduk son olarak .Net ortamına ait ayalarmaları yaptık peki .Net’de redis session’ı nasıl kullanacağız verileri redis’e nasıl atacağız attığımız farklı formattaki veriler redis üzerinde nasıl tutuluyor bunları görebilmek için hemen kod örneklerine geçelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | using System.Web.Mvc; using System.Linq; using WebApplication1.Models; namespace WebApplication1.Controllers { public class HomeController : Controller { public ActionResult Index() { using (var context = new Entities()) { Session["List"] = context.GeneralSettings.ToList(); Session["IsGender"] = true; Session["FullName"] = "Murat ÖNER"; Session["Web"] = "http://www.muratoner.net"; Session["City"] = new City { CityName = "Ankara", ID = 1, Country = new Country { CountryName = "Türkiye", ID = 1 } }; return View(); } } } } |
Gördüğünüz gibi normal Session kullanımından hiçbir farkı yok sadece şöyle bir durum sözkonusu Session’a aktaracağınız değer List ve City değerlerinde olduğu gibi class liste v.b. complex veriler ise o zaman bu class’ları SerializableAttribute ile işaretlemelisiniz yoksa hata alacaksınızdır.
Session’a set ettiğimiz bu değerlerin Redis Desktop Manager’dan nasıl gözüktüğüne bakalım.
Gördüğünüz gibi db0 altında HomeController Index action’ında ayarladığımız değerlerin yer aldığını görüyoruz. Eğer db0 değilde diğer db’lerden birini kullanmak isterseniz Web.config’de session provider etiketinin databaseId attribute’üne 0-15 arası değer girmelisiniz hangi db’yi kullanacaksanız default 0 örnek resimdede görebileceğiniz gibi.
Hocam merhaba, ben projemde redisi yalnızca sayfalar arası geçiş sırasında bazı verileri tutmak için kullanmayı hedefliyorum. Fakat Microsoft.Extensions.Caching.Redis paketini yükleyip program.cs de(projem .Net6) AddDistributedRedisCache() metodu ile redis servisini eklediğimde default olarak session yapılandırmasını kendi kontrol ediyor. Ben bu iş için jwt kullanıyorum ve kendi middleware’imi yazarak gerekli kontrolleri zaten sağlıyorum. Redisin default session yapılandırma özelliğini nasıl devre dışı bırakabilirim bu konuda bilginiz var mı ? Şimdiden teşekkürler.
Merhaba, makale için çok teşekkürler. Bir sorum olacak. örneğin her kullanıcının tek bir yerde oturum açmasını istiyoruz diyelim. Başka bir bilgisayardan girdiğinde, diğer yerlerdeki oturumu kapamasını istiyoruz. Bunu redi ile nasıl gerçekleştirebiliriz? Ayrıca diyelim ki, sunucu kapandı, tekrar açıldı. Kullanıcı bilgileri redis’te saklanacak. Onların hepsini silme şansımız var mı? Yada, istediğimiz herhangi bir kullanıcıyı sildiğimiz zaman, session verisini silme şansımız var mı?
Merhaba Gökhan,
Açıkçası Redis üzerinden böyle birşey kurgulamadım ama aklıma gelenleri açıklarsam belki yol gösterici olur Her kullanıcının tek bir yerden oturum açmasıyla ilgili
10100
id’li user üzerinden gidersek redis için10100_IP_ADDRESS
diye keyini ayarlayıp değerine giriş yapılan ip adresini girersen yine aynı kullanıcı giriş yaptığında redis’de10100_IP_ADDRESS
keyini kontrol edip değeri yeni giriş yapılan ip adresi ile aynı değilse yeni ip adresini keyin değerine set edersin ve custom olarak hazırladığın bir action filter’ı içinden ip adresini kontrol edersin eğer aynı kullanıcı diğer lokasyonlardan tekrar erişmeye çalışırsa ip adresi eşleşmediği için doğal olarak işlemleri yapılamayacak ve login ekranına yönlendirilmesini sağlayabilirsin.Diğer bir sorun olan redis üzerindeki tüm verileri silmek için ise bilgisayar açılışında
C:\Program Files\Redis
dizininde yer alanredis-cli
komut satırı aracı üzerindenredis-cli KEYS *
komutunu çalıştırırsanız redis’deki tüm keyleri alırsınız ve bu keyleri foreach v.b. döngüler ileDEL keyadı
komutu ile redis kayıtlarını silebilirsiniz. Umarım faydalı olmuştur bu bilgiler.