<四>ASP.NETCORE Session和cache
一.应用程序状态的可选方式
-
HttpContext.Items
当数据仅用于一个请求中时,用Items集合储存是最好的方式。数据将在每个请求结束之后被丢弃。它是组件和中间件在一个请求期间的不同时间点进行互相通信的最佳手段。 -
QucryString 和Post
在查询字符串(QueryString)中添加数值,或利用 POST 发送数据,可以将一个请求的状态数据提供给另一个请求。 -
Cookies
与状态有关的非常小量的数据可以储存在Cookies 中。 -
Session
会话(Session)储存依靠一个基于Cookie 的标识符来访问与给定浏览器(来自一个特定器和特定浏览器的一系列访问请求)会话相关的数据。 -
Cache
缓存(Caching〉提供了一种方法,用开发者自定义的键对应用程序数据进行储存和快速检索。 -
Configuration
配置(Configuration)可以被认为是应用程序状态储存的另外一种形式,不过通常它在程序运行的时候是只读的。 -
其他形式
任何其他形式的持久化储存,无论是Entity Framework 和数据库,都可以被用来储存应用程序状态。2、
二、应用状态使用(session)
1、配置使用Session
ASP.NET Core 发布了一个关于 session的程序包,里面提供了用于管理session 状态的中间件。你可以在project.json中加入对Microsoft.AspNetCore.Session的引用来安装这个程序包。
注册服务
services.Addsession( );
app. UsesSession ( ) ;
Session利用一个cookie来跟踪和区分不同浏览器发出的请求。默认情况下,这个cookie被命名为“.AspNet.Session”,并使用路径“/”。此外,在默认情况下,这个cookie不指定域,而且对于页面的客户端脚本是不可使用的,因为CookieHttpOnly的默认值是True。
这些默认值,以及默认的IdleTimeout(独立于cookie在服务端使用),都可以通过SessionOptions配置Session的时候覆盖重写,如下所示:
services. AddSession (options -> { options.cookieName = ".Adventureworks.session" ;options. IdleTimeout = Timespan .Fromseconds (10) ; } ) ;
ldleTimeout在服务端用来决定在会话被抛弃之前可以闲置多久。任何来到网站的请求通过Session中间件(无论这中间件对Session是读取还是写入)都会重置会话的超时时间。注意这是独立于cookie的过期时间。
Session是无锁的,因此如果两个请求都尝试修改会话的内容,最后一个会成功。此外,Session被实现为一个内容连贯的会话,就是说所有的内容都是一起储存的。这就意味着,如果两个请求是在修改会话中不同的部分,不同键的值,他们还是会互相造成影响。
using Microsoft.AspNetCore.Http;//需要添加此应用 public static class SessionExtensions { public static void SetObjectAsJson<T>(this ISession session, string key, T value) { session.SetString(key, JsonConvert.SerializeObject(value)); } public static T GetObjectFromJson<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value); } }
HttpContext.Session.SetObjectAsJson("SessionKey", Model); HttpContext.Session.GetObjectFromJson<Model>("SessionKey");
三、缓存(cache)
.NET Core中提供了Caching的组件。目前Caching组件提供了三种存储方式。
- Memory
- Redis
- sQLServer
1、Memory
Install-Package Microsoft.Extensions.Caching.Memory
services. AddlMemorycache ( ) ;
public class HomeController : controller private IMemorycache _memorycache; public Homecontroller (IMemorycache memorycache) { _memorycache = memorycache; ) public IActionResult Index { string cacheKey = "key" ; string result; if ( !_memoryCache. TryGetvalue(cacheKey, out result)) { result =DateTime.Now.tostring(); _memorycache. set (cacheKey, result); } viewBag.cache = result; return view ( ); }