[譯]ASP.NET Core 2.0 會話狀態

三生石上(FineUI控制元件)發表於2017-10-27

問題

如何在ASP.NET Core 2.0中儲存會話狀態?

答案

建立一個空專案,修改Startup類的ConfigureServices()方法,新增會話狀態服務和它後臺的儲存服務:

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

在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}");
	});
}

執行,此時頁面效果:

 

討論

我們可以使用會話狀態在同一個瀏覽器不同HTTP請求之間共享資料。這個資料是儲存在快取中的(也就是IDistributedCache實現),並且可以透過HttpContext.Session屬性來訪問。

為了關聯不同的HTTP請求,一個Cookie被儲存到瀏覽器端,它的預設名稱是.AspNetCore.Session.

在配置會話狀態服務時,我們可以設定各種屬性:

1. HttpOnly:設定Cookie是否可以透過JavaScript訪問。預設值是true,也就是說在客戶端不能透過指令碼訪問。

2. Name:用來覆蓋預設的Cookie名稱。

3. SecurePolicy:是否只能透過HTTPS請求來傳輸Cookie資訊。

4. IdelTimeout:設定會話的過期時間,每一個後續的請求都會重置這個時間。預設值是20分鐘。

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

	services.AddSession(options => {
		options.Cookie.HttpOnly = true;
		options.Cookie.Name = ".Sanshi.Session";
		options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
		options.IdleTimeout = TimeSpan.FromMinutes(10);
	});
}

下面我們對比下,預設的Cookie:

配置Session的Cookie.Name屬性之後:

儲存物件

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屬性。

 

原始碼下載

 

原文:https://tahirnaushad.com/2017/08/18/asp-net-core-session-state/

相關文章