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