天天看點

ASP.NET Core使用Session

不知道各位夥伴在學習.NET Core過程中有沒有發現,Session沒法直接用的,和以前的.NET Framework架構相比,已經不再是簡簡單單的Session來調用了,這确實是個挺操蛋的問題,但是人家這麼安排也有它的道理,讓我們去更好的熟悉它的使用過程,其實Session的使用,相當于被它封裝成了類似中間件這種獨立的子產品來使用,下面我們就來探究下,怎麼.NET Core中使用Session:

同樣的,我們需要在Startup.cs注入一下Session,一行代碼輕松解決:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
      //session
      app.UseSession();
 }
    
           
這裡需要注意啊,其餘多餘的代碼已經被我我省略了,這裡隻探究Session的使用,你原來配置好的代碼,千萬别删,注入Session确實就是這麼簡單,可是使用起來可不是這麼簡單哦!簡單的String、Int來記住和從Session我相信一點問題都沒有。
//Int類型設定、讀取
 HttpContext.Session.SetInt32("intKey", 1258);
 int intKey = (int)HttpContext.Session.GetInt32("intKey");

  //string類型設定、讀取
  HttpContext.Session.SetString("strKey", "strKey");
  string strKey = HttpContext.Session.GetString("strKey");
  
           
很簡單對吧,看起來是挺簡單的,可是在實際的使用過程中,我們的Session難道就隻會用來記住string、Int,簡單的類型?顯然是不可能的,.NET Core的Session比較煩人的是,當我使用Session記住的是泛型,如:使用者資訊類,那它儲存的是二進制資料,是以我們需要一個輔助類來進行Byte轉換,進而保證拿到的是我們想要的、直覺的資料:
public class ByteConvert
    {
        /// <summary>
        /// 轉換byte[]
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static byte[] ConvertByte(object obj)
        {
            string json = JsonConvert.SerializeObject(obj);
            byte[] result = Encoding.UTF8.GetBytes(json);
            return result;
        }

        /// <summary>
        /// 轉換object
        /// </summary>
        /// <param name=""></param>
        /// <param name=""></param>
        /// <returns></returns>
        public static object GetObject(byte[] buffer)
        {
            string json = Encoding.UTF8.GetString(buffer);
            var result=JsonConvert.DeserializeObject<object>(json);
            return result;
        }

        /// <summary>
        /// 泛型轉換object
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static T GetObject<T>(byte[] buffer)
        {
            string json = Encoding.UTF8.GetString(buffer);
            var result = JsonConvert.DeserializeObject<T>(json);
            return result;
        }
           
我們再來看具體實作:還是那句話,我們隻是使用者,不是開發者,既然要這麼用,這麼用能實作,那代碼就這樣碼吧。大家都這麼碼,這麼碼也不錯,對吧。加油,年輕人!!!
/// <summary>
        /// 擷取登入使用者
        /// </summary>
        /// <returns></returns>
        public Users CurrentUser
        {
            get
            {
                return ByteConvert.GetObject<Users>(HttpContext.Session.Get("CurrentUser"));
            }
        }