Session State در ASP.NET Core 2.0

در این مقاله قصد داریم تا شما را با Session State در ASP.NET Core 2.0 آشنا کنیم و به طور خلاصه به بررسی برخی از نکات و ویژگی های آن بپردازیم.با ما همراه باشید.

Session State در ASP.NET Core 2.0

مشکل

چگونه باید داده را در session state با استفاده از ASP.NET Core ذخیره کنیم.

راه حل

با استفاده از ایجاد یک پروژه خالی ، سپس متد ()ConfigureServicee واقع در کلاس Startup  را اصلاح میکنیم و سرویس هایی  برای  session و backing store آن اضافه کنید.

public void ConfigureServices(  
      IServiceCollection services)  
  {  
      services.AddDistributedMemoryCache();  
      services.AddSession();  
  }  

middleware session را در متد ()Configure ، اضافه کنید.

public void Configure(  
          IApplicationBuilder app,  
          IHostingEnvironment env)  
      {  
          app.UseSession();  
  
          app.Use(async (context, next) =>  
          {  
              context.Session.SetString("GreetingMessage", "Hello Session State");  
              await next();  
          });  
  
          app.Run(async (context) =>  
          {  
              var message = context.Session.GetString("GreetingMessage");  
              await context.Response.WriteAsync($"{message}");  
          });  
      }  

توضیحات

ما میتوانیم از session به جای اشتراک گذاشتن اطلاعات بین درخواست های HTTP مختلف ورودی از یک مرورگر استفاده کنیم.داده ها در یک cache  ذخیره میشوند و از طریق ویژگی HttpContext.Session قابل دسترس است.یک کوکی در مرورگر ذخیره می شود تا درخواست های HTTP را هماهنگ کند.نام پیش فرض این کوکی AspNet.Session است.

در طول تنظیمات سرویس های سشن ما میتوانیم خواص مختلف را تنظیم کنیم.

HttpOnly : 

تعیین می کند که آیا کوکی از طریق جاوا اسکریپت قابل دسترس باشد.مقدار پیشفرض آن True است ، که به این معناست که از طریق اسکریپت ها در سمت کاربر قابل دسترس نیست.

Name :

برای بازنویسی نام پیشفرض Cookie استفاده میشود.

SecurePolicy :

تعیین می کند که آیا کوکی سشن تنها از طریق درخواست های HTTPS منتقل میشود.

IdleTimeout :

زمان پایان اعتبار سشن را تنظیم میکند ، هر درخواست timeout را ریست میکند و مقدار پیشفرض آن برابر 20 دقیقه است.

public void ConfigureServices(  
       IServiceCollection services)  
    {  
        services.AddDistributedMemoryCache();  
        services.AddSession(options =>  
        {  
            options.Cookie.HttpOnly = true;  
            options.Cookie.Name = ".Fiver.Session";  
            options.Cookie.SecurePolicy = CookieSecurePolicy.Always;  
            options.IdleTimeout = TimeSpan.FromMinutes(10);  
        });  
    } 

اشیاء ذخیره سازی

HttpContext.Session یک راه ساخته شده برای ذخیره سازی اشیاء پیچیده را فراهم نمی کند، با این حال، ما می توانیم برای دستیابی به این ، اشیا را در رشته های JSON سریالیزه کنیم .

public static class SessionExtensions  
  {  
      public static void SetObject<T>(this ISession session, string key, T value)  
      {  
          session.SetString(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);  
      }  
  }  

اکنون می توانیم از متد های توسعه ( extension method ) مانند زیر  استفاده کنیم:

public void Configure(  
     IApplicationBuilder app,  
     IHostingEnvironment env,  
     ILoggerFactory loggerFactory)  
 {  
     app.UseSession();  
  
     app.Use(async (context, next) =>  
     {  
         context.Session.SetObject("CurrentUser",  
             new UserInfo { Username = "James", Email = "james@bond.com"  });  
         await next();  
     });  
  
     app.Run(async (context) =>  
     {  
         var user = context.Session.GetObject<UserInfo>("CurrentUser");  
         await context.Response.WriteAsync($"{user.Username}, {user.Email}");  
     });  
 }  

دسترسی از طریق تزریق وابستگی

برای دسترسی به session  ها با استفاده از تزریق وابستگی ، می توانید از IHttpContextAccessor (از طریق سازنده) استفاده کنید که به شما توانایی دسترسی به  HttpContext را میدهد.