6月 19

.net中的session需要添加引用nuget包

Microsoft.AspNetCore.Session

Session 是基于 IDistributedCache 构建的,所以必须引用一种 IDistributedCache 的实现,ASP.NET Core 提供了多种 IDistributedCache 的实现,如内存、数据库、redis等。所以也需要引用对应的nuget包,一种就可以

Microsoft.Extensions.Caching.Memory
Microsoft.Extensions.Caching.Redis
Microsoft.Extensions.Caching.SqlServer

这里先用最简单的Memory举例

 

添加startup->ConfigureServices

services.AddSession();

添加startup->Configure

app.UseSession();

特别注意:UseSession要在UseMvc之前,否则会有问题

然后在Controller中就可以使用session了

保存session

var b = System.Text.Encoding.UTF8.GetBytes("这个是测试.来自 http://blog.wx6.org");
HttpContext.Session.Set("key", b);

获取session

HttpContext.Session.TryGetValue("key", out byte[] xxx);
var s = System.Text.Encoding.UTF8.GetString(xxx);

这里获取和设置都使用的byte[]类型。这是因为.net core下的session可以远程服务器保存,因此就必须支持序列化。好在微软在Microsoft.AspNet.Http命名空间下,为我们添加了几个扩展方法,分别用于设置和保存byte[]类型、int类型、以及string类型

需要引用nuget包

Microsoft.AspNet.Http.Extensions.dll

  

另外,类库中不能直接使用,需要注入才可以调到,定义方法体如下

public static void Set1(ISession session)
{
    session.SetString("kkk", "dddd");
}

调用方式,是在Controller中调用

Class1.Set1(HttpContext.Session);

 

 

 

写了两个帮助类

    public static class SessionHelper
    { 
        public static void Set(this ISession session, string key, object obj)
        { 
            session.Set(key, ByteHelper.Object2Bytes(obj));
        }
        public static T Get<T>(this ISession session, string key)
        {
            var b = new byte[] { };
            session.TryGetValue(key, out b);
            return ByteHelper.Bytes2Object<T>(b); 
        }
    }

用到的ByteHelper

    public class ByteHelper
    {
        /// <summary>
        /// 将对象转换为byte数组
        /// </summary>
        /// <param name="obj">被转换对象</param>
        /// <returns>转换后byte数组</returns>
        public static byte[] Object2Bytes(object obj)
        {
            string json = JsonConvert.SerializeObject(obj);
            byte[] serializedResult = System.Text.Encoding.UTF8.GetBytes(json);
            return serializedResult;
        }

        /// <summary>
        /// 将byte数组转换成对象
        /// </summary>
        /// <param name="buff">被转换byte数组</param>
        /// <returns>转换完成后的对象</returns>
        public static object Bytes2Object(byte[] buff)
        {
            string json = System.Text.Encoding.UTF8.GetString(buff);
            return JsonConvert.DeserializeObject<object>(json);
        } 

        /// <summary>
        /// 将byte数组转换成对象
        /// </summary>
        /// <param name="buff">被转换byte数组</param>
        /// <returns>转换完成后的对象</returns>
        public static T Bytes2Object<T>(byte[] buff)
        {
            string json = System.Text.Encoding.UTF8.GetString(buff);
            return JsonConvert.DeserializeObject<T>(json);
        }
    }

written by ocean \\ tags:


Leave a Reply