
در این مقاله خواهیم دید که ASP.NET Core چه تفاوت هایی در رابطه با Session ها معرفی کرده است.HTTP یک پروتکل بدون حالت است. بنابراین نیاز به مکانیزم هایی جهت حفظ App State خود داریم.
Server Side Session روشی برای حفظ وضعیت ما در سمت سرور بوده است.
در این مقاله ، چگونه پیش از ASP.NET Core از Session ها استفاده می کردیم خواهیم پرداخت و سپس نحوه ی دسترسی به Session ها را در ASP.NET Core خواهیم دید.
Session در دوره ی قبل از ASP.NET Core
متغیر Session در Controller ها/Form های خود
System.Web.HttpContext.Current.Session در محل هایی که به متغیر Session دسترسی مستقیم ندارید.
Session["mydata"] = 10;
یا جهت دسترسی در محل هایی که Session در دسترس نیست (برای مثال کلاس های Non _Controller)
System.Web.HttpContext.Current.Session["mydata"] = 10;
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.2.0" />
services.AddDistributedMemoryCache();//To Store session in Memory, This is default implementation of IDistributedCache services.AddSession();
app.UseCookiePolicy(); app.UseSession(); app.UseMvc(routes =>
app.UseCookiePolicy();
هنگامی که برنامه ای اجرا می شود، کاربر باید 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
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
حال یک کلاس (مثلا TestManager) که می خواهید در آن به Session در Startup.ConfigureServices دسترسی یابید، ثبت کنید؛
services.AddScoped<TestManager>();
نکته
می توانید از AddTransient یا AddSingleton بر طبق منطق خود استفاده کنید.
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 تغییر کرده است؟
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 های پیشین دیده ایم می باشد. تفاوت حقیقی این است که اکنون، مرتب تر و در استفاده منعطف تر است.
برچسب:
نویسنده: دانلودی