轉自:https://tahirnaushad.com/2017/08/18/asp-net-core-session-state/
Asp.net core使用session:
在nuget 安裝Microsoft.AspNetCore.Session
在新建Asp.net core應用程序后,要使用session中間件,在startup.cs中需執行三個步驟:
1.使用實現了IDistributedcache接口的服務來啟用內存緩存。(例如使用內存緩存)
//該步驟需在addsession()調用前使用。
2.調用addsession方法

3.使用usesession回調(usesession需在useMvc()方法前調用)

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false; //注意這里需要設置為false,默認為true
options.MinimumSameSitePolicy = SameSiteMode.None;
});
//注冊數據庫上下文
services.AddDbContext<IgbomContext>();
services.AddTransient<IRepository<Device>, DeviceRepository>();
services.AddTransient<IRepository<User>, UserRepository>();
services.AddTransient<IRepository<MenuRoot>, MenuRootRepository>();
services.AddDistributedMemoryCache();
services.AddSession();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
存儲對象
HttpContext.Session(實現了ISession接口)沒有提供保存復雜對象的方法,然而我們可以通過序列化對象為字符串來實現這個功能:
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);
}
}
JsonConvert是Newtonsoft.Json庫的一個靜態類,可以方便的在.Net類型和JSON類型之間轉換,VS可以快速添加:

接下來,我們就可以使用這些擴展方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
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}");
});
}

通過依賴注入訪問
我們可以通過構造函數注入方式來使用會話狀態(IHttpContextAccessor),然后通過這個接口來訪問HttpContext屬性。
