[转]ASP.NET Core基本原理(11)-管理应用程序状态
本文轉自:http://zhuchenglin.me/fundamentals-11-app-state?utm_source=tuicool&utm_medium=referral
ASP.NET Core基本原理(11)-管理應用程序狀態(tài)[譯]
在ASP.NET Core中,應用程序的狀態(tài)可以有多種方式進行管理,取決于何時以及如何檢索狀態(tài)。
應用程序狀態(tài)的可選方式
應用程序狀態(tài)指用于描述應用程序當前狀態(tài)的任何數據。這包含全局和特定于用戶的數據。ASP.NET之前的版本已經有內置的對全局Application 和 Session 狀態(tài)的支持。
應用程序開發(fā)者可以根據不同的因素來自由選擇不同的方式存儲狀態(tài)數據:
- 數據需要持續(xù)多長時間?
- 數據有多大?
- 數據的格式是什么?
- 數據是否可以序列化?
- 數據有多敏感?能不能保存在客戶端?
基于這些問題的答案,在ASP.NET Core以不同的方式存儲和管理應用程序的狀態(tài)。
HttpContext.Items
當數據只用于一個給定請求進行處理時,Items集合是存儲數據的最佳位置。數據內容將在每個請求結束之后被丟棄。可以作為組件或者中間件在一個請求期間的不同時間點進行通信的最佳手段,并且彼此之間沒有直接關系。
QueryString and Post
在新的請求查詢字符串中添加值或者通過POSTing數據,可以將一個請求的狀態(tài)數據提供給另一個請求。這種技術不應該用于敏感性的數據,因為這種技術需要將數據發(fā)送給客戶端,然后再發(fā)送回服務器。也最好用于少量的數據。查詢字符串對于持久地保留狀態(tài)特別有用,允許創(chuàng)建具有嵌入狀態(tài)的鏈接并通過Email和社交網絡進行發(fā)送,沒有對做出請求的用戶做出假設,因為具有查詢字符串的URL可以很容易被分享,所以必須小心避免跨站請求偽裝攻擊 (Cross-Site Request Forgery, CSRF)(例如,即使假設只有驗證的用戶才能夠使用基于URL的查詢字符串,攻擊者還是誘騙已經驗證過的用戶去訪問這樣的URL)。
Cookies
與狀態(tài)有關的少量數據可以存儲在Cookies中。它們給隨每次請求被發(fā)送,所以它的大小應該保存最小化。理想情況下,應該只使用一個標識符,而真正的數據存儲在服務器中。
Session
Session存儲依靠一個基于Cookie的標識符來訪問與給定瀏覽器Session相關的數據(來自一個特定瀏覽器和機器的一系列請求)。你不能假設一個Session只限定給一個用戶。所以要謹慎考慮在Session中存儲哪類信息。這是一個很好的地方來存儲具體到一個特定Session但不需要持久保存的應用程序狀態(tài)。
Cache
緩存提供了一種基于開發(fā)人員定義的鍵來存儲和有效檢索任意應用程序數據的方法。它提供了基于時間和其他因素來使緩存過期的規(guī)則。
Configuration
配置可以認為是應用程序狀態(tài)存儲的另一種形式,但是通常它的應用程序運行時是只讀的。
使用HttpContext.Items
HttpContext抽象通過Items提供了對一個簡單的IDictionary<object, object>類型的字典集合的支持。在每個請求中,這個集合從HttpRequest。你不能假設一個Session只限定給一個用戶。所以要謹慎考慮在Session中存儲哪類信息。這是一個很好的地方來存儲具體到一個特定Session但不需要持久保存的應用程序狀態(tài)。
例如,一個簡單的中間件可以向Items集合中添加一些內容:
app.Use(async (context, next) => { // perform some verification context.Items["isVerified"] = true; await next.Invoke(); });隨后,在管道中,其它的中間件可以訪問到它:
app.Run(async (context) => { await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]); });安裝和配置Session
ASP.NET Core提供了一個會話包,它提供了用于管理會話狀態(tài)的中間件。你可以在project.json文件中加入對Microsoft.AspNetCore.Session包的引用來安裝它。
一旦安裝好程序包,必須在Startup類中對Session進行配置。Session是基于IDistributedCache進行構建的,因此也必須配置它,否則你會得到一個錯誤。
注:如果你一個IDistributedCache實現都沒有配置,則會得到一個異常 - “Unable to resolve service for type ‘Microsoft.Extensions.Caching.Distributed.IDistributedCache’ while attempting to activate ‘Microsoft.AspNetCore.Session.DistributedSessionStore’.”
ASP.NET提供了IDistributedCache的多種實現,包含in-memory選項(僅用于開發(fā)和測試期間)。要配置Session使用采用in-memory選項,將Microsoft.Extensions.Caching.Memory依賴項添加到你的project.json中,然后再添加如下代碼到ConfigureServices:
services.AddDistributedMemoryCache(); services.AddSession();然后,添加如下代碼到Configure,并且添加到app.UseMVC()之前,這樣你就可以在程序代碼中使用會話了:
app.UseSession();安裝和配置好之后,你就可以從HttpContext中引用Session了。
注:如果你在調用UseSession之前嘗試訪問Session,你將會得到一個InvalidOperationException異常 - “Session has not been configured for this application or request.”
實現細節(jié)
Session是利用一個cookie來跟蹤和區(qū)分不同瀏覽器之間的請求的。默認情況下,這個cookie命名為”.AspNet.Session”,并使用一個路徑”/”。另外,在默認情況下,這個cookie不指定域,而且對于頁面上的客戶端腳本是不可使用的(因為CookieHttpOnly的默認值是true)。
這些默認值,以及IdleTimeout(獨立于cookie在服務端使用),都可以通過SessionOptions在配置Session的時候重寫:
services.AddSession(options => { options.CookieName = ".AdventureWorks.Session"; options.IdleTimeout = TimeSpan.FromSeconds(10); });IdleTimeout被服務端用于決定在Session的內容被拋棄之前Session可以閑置多久。每一個請求通過Session中間件(無論中間件對Session是讀取還是寫入)都將會重置超時時間。注意,這與cookie的過期時間是獨立的。
ISession
一旦Session安裝和配置完成,你就可以通過HttpContext所暴露的一個ISession類型名為Session的屬性來引用它。
public interface ISession {bool IsAvailable { get; } string Id { get; } IEnumerable<string> Keys { get; } Task LoadAsync(); Task CommitAsync(); bool TryGetValue(string key, out byte[] value); void Set(string key, byte[] value); void Remove(string key); void Clear(); }因為Session構建在IDistributedCache之上,你必須總是序列化被存儲的對象實例。因此,這個接口使用byte[]而不是直接使用object。不過,有擴展方法可以讓使用諸如String 和 Int32變得更容易。
// session extension usage examples context.Session.SetInt32("key1", 123); int? val = context.Session.GetInt32("key1"); context.Session.SetString("key2", "value"); string stringVal = context.Session.GetString("key2"); byte[] result = context.Session.Get("key3");如果要存儲更復雜的對象,你需要把對象序列化為一個byte[]以便存儲它們,在獲取對象的時候,要將它們從byte[]進行反序列化。
原文鏈接
Managing Application State
?
轉載于:https://www.cnblogs.com/freeliver54/p/6364489.html
總結
以上是生活随笔為你收集整理的[转]ASP.NET Core基本原理(11)-管理应用程序状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTAssetsPickerContro
- 下一篇: 关于OnPaint、FormPaint会