您好,登錄后才能下訂單哦!
這篇文章主要介紹了ASP.NET Core怎么管理應用程序狀態的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇ASP.NET Core怎么管理應用程序狀態文章都會有所收獲,下面我們一起來看看吧。
在ASP.NET Core中,由多種途徑可以對應用程序狀態進行管理,使用哪種途徑,由檢索狀態的時機和方式決定。
應用程序狀態指的是用于描述當前狀況的任意數據。包括全局和用戶特有的數據。
開發人員可以根據不同的因素來選擇不同的方式存儲狀態數據:
數據需要存儲多久
數據有多大
數據的格式是什么
數據是否可以序列化
數據有多敏感
數據能否保存在客戶端
當數據僅用于一個請求中時,用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"]); });
在查詢字符串(QueryString )中添加值,或利用Post發送數據,可以將一個請求的狀態數據提供給另一個請求。這不適合敏感數據,因為這需要將數據發送到客戶端,然后再發送給服務器。這種方法也只適用于少量數據。用戶提交的數據是無法預期的,帶查詢字符串的網址很容易泄露,所以要避免跨網站請求偽裝攻擊(CSRF)。
與狀態有關的小量數據可以存儲在Cookies中。他們會隨每次請求被發送到客戶端。應該只使用一個標識符,真正的數據存儲在服務端,服務端的數據與這個標識關聯。
會話存儲依靠一個基于Cookie的標識符來訪問與給定瀏覽器相關的會話數據。一個會話可以與多個Cookie關聯。
緩存提供了一種方法,用自定義的鍵對應用程序數據進行存儲和檢索。它提供了一套基于時間和其他因素使緩存過期的規則。
還可以使用EF和數據庫等進行存儲應用程序狀態。
首先要安裝Microsoft.AspNetCore.Session安裝包。然后在Startup類中配置。Session是基于IDistributedCache構建的,因此必須先配置好Session,否則會報錯。
services.AddDistributedMemoryCache(); services.AddSession(options => { options.Cookie.Name = "Test.Session"; options.IdleTimeout = TimeSpan.FromSeconds(10); });
ASP.NET 提供了IDistributedCache的多種實現,in-memory是其中之一。上面采用in-memory,需要先安裝Microsoft.Extensions.Caching.Memory,然后添加上面代碼。
最后在Configure中調用 app.UseSession(),需要在app.UseMvc使用之前調用。
Session利用一個cookie來跟蹤和區分不同瀏覽器發出的請求。默認情況下,這個cookie被命名為“.ASP.Session”,并使用路徑“/”。默認情況下,這個cookie不指定域,而且對于頁面的客戶端腳本是不可使用的,因為CookieHttpOnly默認為True。
其他的值可以通過SessionOptions配置:
services.AddSession(options => { options.Cookie.Name = "Test.Session"; options.IdleTimeout = TimeSpan.FromSeconds(10); });
IdleTimeout 在服務端決定過期時間,session的過期時間是獨立于cookie的。
安裝和配置好session之后,就可以通過HttpContext的一個名為Session,類型為ISession的屬性來引用會話。
public interface ISession { // // 摘要: // Indicate whether the current session has loaded. bool IsAvailable { get; } // // 摘要: // A unique identifier for the current session. This is not the same as the session // cookie since the cookie lifetime may not be the same as the session entry lifetime // in the data store. string Id { get; } // // 摘要: // Enumerates all the keys, if any. IEnumerable<string> Keys { get; } // // 摘要: // Remove all entries from the current session, if any. The session cookie is not // removed. void Clear(); // // 摘要: // Store the session in the data store. This may throw if the data store is unavailable. Task CommitAsync(CancellationToken cancellationToken = default(CancellationToken)); // // 摘要: // Load the session from the data store. This may throw if the data store is unavailable. Task LoadAsync(CancellationToken cancellationToken = default(CancellationToken)); // // 摘要: // Remove the given key from the session if present. // // 參數: // key: void Remove(string key); // // 摘要: // Set the given key and value in the current session. This will throw if the 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> /// <param name="Bytes"></param> /// <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怎么管理應用程序狀態”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“ASP.NET Core怎么管理應用程序狀態”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。