.net core中的Session以及HttpContext對象使用小結

session用於識別用戶並保持用戶信息,就是一個會話 ,在瀏覽器不關閉的前提下,可以保存用戶的信息,比如登錄的保存用戶信息從一個網頁跳轉到另一個網頁,你的用戶信息就可以用session。

.net core是一個高度組件化的框架,很多功能比如授權,認證,回話狀態等都是通過中間件的方式引入的,必須基於NuGet添加,或者基於project.json添加,然後保存VS會啓動還原類庫。

1、添加Session

在你的項目上基於NuGet添加:Microsoft.AspNetCore.Session。一般我們在建立core web項目時,程序已經添加了對session的支持。

2、添加Session配置服務

在startup.cs找到方法ConfigureServices(IServiceCollection services) 注入Session(這個地方是Asp.net Core pipeline):

配置session超時時間60分鐘。

services.AddSession(o =>
            {
                o.IdleTimeout = TimeSpan.FromSeconds(60 * 60);
            });

也可以不指定時間:services.AddSession();

3、啓用Session配置

session注入到了服務,我們還要告訴Asp.net Core使用內存存儲Session數據    app.UseSession();

注意放置代碼的順序,Session必須在MVC之前。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }
            //用戶session服務
            app.UseSession();

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            //app.UseCookiePolicy();

            //創建路由
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "Default",
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Home", action = "Index" }
                );
            });
            app.UseMvc();
        }

 

在MVC Controller裏使用HttpContext.Session

public class HomeController:Controller
{
   public IActionResult Index()
   {
       HttpContext.Session.SetString("code","123456");
       return View();
    }
 
    public IActionResult About()
    {
       ViewBag.Code=HttpContext.Session.GetString("code");
       return View();
    }
}

 

2、如果不是在Controller裏,你可以注入IHttpContextAccessor,有兩種方式,一種是在類的構造函數裏面注入,如下:

public class SomeOtherClass
{
   private readonly IHttpContextAccessor _httpContextAccessor;
   private ISession _session=> _httpContextAccessor.HttpContext.Session;
 
   public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
   {
      _httpContextAccessor=httpContextAccessor;      
   }
 
   public void Set()
   {
     _session.SetString("code","123456");
   }
   
   public void Get()
  {
     string code = _session.GetString("code");
   }
}

 

3、另外一種是通過IServiceProvider,這時需要在startup中Configure中得到這個對象,然後通過

Microsoft.AspNetCore.Http.IHttpContextAccessor factory = app.ApplicationServices.GetService<Microsoft.AspNetCore.Http.IHttpContextAccessor>();
Microsoft.AspNetCore.Http.HttpContext context = factory.HttpContext;

 

或者

Microsoft.AspNetCore.Http.IHttpContextAccessor factory = app.ApplicationServices.GetService(typeof(Microsoft.AspNetCore.Http.IHttpContextAccessor));
Microsoft.AspNetCore.Http.HttpContext context = factory.HttpContext;

 

得到Microsoft.AspNetCore.Http.HttpContext對象,這時就可以和使用HttpContext了,裏面有Session,Request,Response對象的使用,在使用Request對象時,這樣獲取HttpContext.Request.Query[""]請求參數,獲取cookie通過HttpContext.Request.Cookies[""],這裏有一點需要注意netcore中的cookie添加的是通過HttpContext.Response.Cookies.Append方法添加的,和asp.net 不同的是添加的鍵值對的值是自動UrlEncode的,所以獲取cookie的時候是UrlDecode的,這個需要注意。


原文:https://www.jianshu.com/p/0315aa029867

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章