"> Session ها در ASP.NET Core | آموزش .NET Core | ام اس پی سافت

Session ها در ASP.NET Core

Session ها

در این مقاله خواهیم دید که ASP.NET Core چه تفاوت هایی در رابطه با Session ها معرفی کرده است.HTTP یک پروتکل بدون حالت است. بنابراین نیاز به مکانیزم هایی جهت حفظ App State خود داریم.

Server Side Session روشی برای حفظ وضعیت ما در سمت سرور بوده است.

در این مقاله ، چگونه پیش از ASP.NET Core از Session ها استفاده می کردیم خواهیم پرداخت و سپس نحوه ی دسترسی به Session ها را در ASP.NET Core خواهیم دید.

Session در دوره ی قبل از ASP.NET Core

  • قابلیت Session را بطور پیش فرض در اختیار دارید (بدون افزودن هیچ پکیجی)
  •  قبل تر، به Session از طرق زیر دسترسی داشتید

 متغیر Session در Controller ها/Form های خود

 System.Web.HttpContext.Current.Session در محل هایی که به متغیر Session دسترسی مستقیم ندارید.

  • هر چیزی که در Session ذخیره می کنید، به عنوان Object ذخیره می شود. مقادیر را در قالب کلید/مقدار ذخیره می کنید.
Session["mydata"] = 10;   

یا جهت دسترسی در محل هایی که Session در دسترس نیست (برای مثال کلاس های Non _Controller)

System.Web.HttpContext.Current.Session["mydata"] = 10;   
  • شبیه سازی  Session Object برای Unit Testing  بسیار دشوار است.

Session در ASP.NET Core

  • اکنون، Session بطور پیش فرض در دسترس نیست.
  • باید پکیج زیر را اضافه کنید. متاپکیج بطور پیش فرض این را در اختیار شما قرار می دهد.
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.2.0" />  
  • در Startup.ConfigureServices، باید کد زیر را جهت ثبت سرویس ها با DI Container اضافه کنید.
services.AddDistributedMemoryCache();//To Store session in Memory, This is default implementation of IDistributedCache    
services.AddSession();  

  •  در Startup.Configure، باید کد زیر (پیش از UseMVC) را جهت افزودن Session Middleware اضافه کنید.
app.UseCookiePolicy();      
app.UseSession();      
app.UseMvc(routes =>   
  •  مطمئن شوید که کد زیر نیز در آنجا باشد (بطور پیش فرض هنگامی که از ASP.NET Core MVC Template استفاده می کنید، اضافه می شود).
app.UseCookiePolicy();   
  •  ASP.NET Core 2.2 به بعد ( Cookie Consent ( true را در فایل Startup اضافه می کند.

هنگامی که برنامه ای اجرا می شود، کاربر باید Cookie Consent را بر روی صفحه بپذیرد.

هنگامی که کاربر سیاست موجود در صفحه را می پذیرد، یک consent cookie ایجاد می کند.

این کار به جهت دنبال کردن GDPR و دادن این کنترل به کاربر که اگر بخواهد cookie های یک سایت را ذخیره کند یا خیر می باشد.

اگر کاربر آن را نپذیرد، Session کار نخواهد کرد، چراکه Session نیاز به یک کوکی جهت ارسال/دریافت شناسه ی نشست دارد.

ممکن است هنگام کار با قالب پیش فرض ASP.NET Core MVC با این مشکل مواجه شوید.

چگونه در Controller به Session دسترسی یابیم؟

متوجه خواهید شد که هم اکنون متغیر “Session” برایتان فعال نیست. Controller اکنون دارای یک ویژگی “HttpContext” می باشد که دارای متغیر “Session” است.

بنابراین، می توانید با استفاده از کد زیر در کنترل کننده به Session دسترسی یابید.

var a = this.HttpContext.Session.GetString("login");    
HttpContext.Session.SetString("login", dto.Login);  

چگونه در کلاس Non-Controller به Session دسترسی یابیم؟

هم اکنون، System.Web.HttpContext.Current.Session را در ASP.NET Core در اختیار ندارید.

جهت دسترسی به Session در کلاس Non-Controller

  1.  ابتدا، سرویس زیر را در Startup.ConfigureServices ثبت کنید؛
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();  

حال یک کلاس (مثلا  TestManager) که می خواهید در آن به Session در Startup.ConfigureServices دسترسی یابید، ثبت کنید؛

services.AddScoped<TestManager>();  

نکته
می توانید از AddTransient یا AddSingleton بر طبق منطق خود استفاده کنید.

  • حال، در کلاس TestManager، کد زیر را اضافه کنید.
private readonly IHttpContextAccessor _httpContextAccessor;    
private readonly ISession _session;    
public TestManager(IHttpContextAccessor httpContextAccessor)    
   {    
        _httpContextAccessor = httpContextAccessor;    
        _session = _httpContextAccessor.HttpContext.Session;    
    } 

کد فوق، شیء IHttpContextAccessor را از طریق تزریق وابستگی دریافت می کند و سپس، Session ها را در یک متغیر محلی ذخیره می کند.

چگونه در فایل View به Session دسترسی یابیم؟

کد زیر را در بالای فایل View خود اضافه کنید.

@using Microsoft.AspNetCore.Http    
@inject IHttpContextAccessor httpContextAccessor   

سپس، می توانید در View خود بصورت زیر به متغیر Session دسترسی یابید.

@httpContextAccessor.HttpContext.Session.GetString("login")   

چه مورد دیگری در رابطه با Session تغییر کرده است؟

  • Session اکنون non-locking است.
  • یک Session تا هنگامی که حداقل یک مقدار در آن نداشته باشید، ایجاد نمی شود.
  • نیاز است جهت get و set داده ها از توابع استفاده کنید. قاعده ی Array هم اکنون پشتیبانی نمی شود.
  • اکنون، ISession تنها متد Get و Set را ارائه می دهد که داده ها را با فرمت Byte Array می گیرد و برمی گرداند.
  •  اگر می خواهید داده ها را به فرمت String ذخیره کنید، می توانید کد زیر را در فایل خود افزوده و از متدهای افزونه استفاده کنید.
using Microsoft.AspNetCore.Http;   

این کد، متدهای افزونه ی جدیدی را آشکار می کند.

SetInt32    
GetInt32    
SetString    
GetString   

در پشت زمینه، این ها داده ها را به بایت تبدیل می کنند.

  • همچنین می توانید متدهای افزونه ی خود را بنویسید.

برای مثال، Extension Methodهای زیر در ذخیره و بازیابی هر نوع داده ای پیچیده به شما کمک می کنند.

public static class SessionExtensions        
    {        
        public static void Set<T>(this ISession session, string key, T value)        
        {        
            session.Set<(key, JsonConvert.SerializeObject(value));        
        }        
        
        public static T GetObject<T>(this ISession session, string key)        
        {        
            var value = session.GetString(key);        
            return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);        
        }        
    }   

خلاصه
مفاهیم Session مشابه آنچه که در .NET Framework های پیشین دیده ایم می باشد. تفاوت حقیقی این است که اکنون، مرتب تر و در استفاده منعطف تر است.

  • پسورد: www.mspsoft.com
زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

کدیشن ! مارکت پروژه های برنامه نویسی راه اندازی شدیه توکه پا بریم ببینم