在ASP.NET Core中,由多种途径可以对应用程序状态进行管理,使用哪种途径,由检索状态的时机和方式决定。
应用程序状态指的是用于描述当前状况的任意数据。包括全局和用户特有的数据。
开发人员可以根据不同的因素来选择不同的方式存储状态数据:
数据需要存储多久数据有多大数据的格式是什么数据是否可以序列化数据有多敏感数据能否保存在客户端1.可选方式
1.HttpContext.Items
当数据仅用于一个请求中时,用Items集合存储时最好的方式。数据将在每个请求结束之后丢弃。它是组件和中间件在一个请求中的不同时间点金总互相通信的最佳手段。
HttpContext抽象提供了一个简单的IDictionary<object,object>类型的字典集合,就是Items。在每个请求中,这个集合从HttpRequest开始就可以使用,直到请求结束丢弃。要想存取集合,可以直接赋值和根据键查询。
app.Use(async (context,next) => { context.Items["isExist"] = true; await next.Invoke(); }); //在之后的管道查询值 app.Run(async (context) => { await context.Response.WriteAsync("Is Exist:"+context.Items["isExist"]); });2.QueryString 和 Post
在查询字符串(QueryString )中添加值,或利用Post发送数据,可以将一个请求的状态数据提供给另一个请求。这不适合敏感数据,因为这需要将数据发送到客户端,然后再发送给服务器。session // was not established prior to sending the response. // // 参数: // key: // // value: void Set(string key, byte[] value); // // 摘要: // Retrieve the value of the given key, if present. // // 参数: // key: // // value: bool TryGetValue(string key, out byte[] value); }
因为Session是建立在IDistributedCache之上的,所以总是需要序列化被存储的对象实例。因此,这个接口是使用byte[]而不是直接使用object。string 和 int32 的简单类型可以直接使用:
HttpContext.Session.SetInt32("key",123); HttpContext.Session.GetInt32("key");存储对象需要先把对象序列化为一个byte[]字节流。需要使用MemoryStream 和 BinaryFormatter
/// <summary> /// 将一个object对象序列化,返回一个byte[] /// </summary> /// <param name="obj">能序列化的对象</param> /// <returns></returns> public static byte[] ObjectToBytes(object obj) { using (MemoryStream ms = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); return ms.GetBuffer(); } } /// <summary> /// 将一个序列化后的byte[]数组还原 /// </summary> www.easck.com /// <param name="Bytes"></parhttp://www.easck.comam> /// <returns></returns> public static object BytesToObject(byte[] Bytes) { using (MemoryStream ms = new MemoryStream(Bytes)) { IFormatter formatter = new BinaryFormatter(); return formatter.Deserialize(ms); } }到此这篇关于ASP.NET Core管理应用程序状态的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。








