Asp.net
跨請求檢索和持久化狀態
我正在編寫我的第一個 ASP.NET Web API 應用程序。我熟悉其他 Web 應用程序框架(主要是 Symfony,還有 Django,以及在較小程度上的 RoR)。
我有點掙扎,以了解從瀏覽器/前端客戶端向 Web 伺服器發送請求後發生的事件順序。
我正在編寫一個使用數據庫後端的多租戶應用程序。我正在使用 ADO 和原始 SQL 來訪問數據庫,我還需要為每個使用者儲存大量資訊,因此基本上,我為使用者創建(或從記憶體中獲取)預載入的上下文。
這是一些虛擬碼,它說明了我在 ASP.NET 中想要實現的目標。
namespace myApp.Controllers { public class FoobarController : ApiController { public Response doLogin(request) { var ctx = myApplicationContext.getInstance(); var user = ctx.getUser(); if (!user.isLoggedOn()) { username = request.getParameter('username'); password= request.getParameter('password'); dbManager = ctx.getDbInstance(); resp = dbManager.internalLogin(username, password); // Load permissions etc for current user, from db // Store user info in cache .. } } public Response ActionOne(request) { ctx = myApplicationContext.getInstance(); user = ctx.getUser(); if (user.hasPermission('xxx')) { } } } }我的問題是,我該如何實現這種功能:
即:
- 創建一個應用程序上下文,我可以在其中填充上下文敏感資訊,如數據庫連接、郵件配置、對象工廠、雜項狀態資訊等。
- 訪問使用者對象(我可以添加使用者憑據、權限等)
- 可以訪問會話變數等嗎?
筆記
- 我將在 Linux 上部署 Web 應用程序,並將使用 Apache 作為 Web 伺服器。
- 出於本項目的目的,我不想使用任何 Microsoft 技術,如 Azure、Windows 身份驗證等(C# 和 ASP.Net 除外)
- 我想使用原始數據庫連接,而不是使用實體管理器(舊應用程序埠)
我有點掙扎,以了解從瀏覽器/前端客戶端向 Web 伺服器發送請求後發生的事件順序。
為此,我會說這個 PDF 海報提供了 ASP.NET WebAPI 中請求處理的最佳圖示。
我的問題是,我該如何實現這種功能:
即:
- 創建一個應用程序上下文,我可以在其中填充上下文敏感資訊,如數據庫連接、郵件配置、對象工廠、雜項狀態資訊等。
- 訪問使用者對象(我可以添加使用者憑據、權限等)
- 可以訪問會話變數等嗎?
為此,我想說,WebAPI 被設計為無狀態的,因此,最好的方法是創建一個持久會話(例如在數據庫中)並為每個請求使用會話標識符(如會話密鑰或令牌)來辨識使用者並獲取他的會話變數/上下文資訊。
現在,為了實現您在範例中要求的那種功能,可以通過組合身份驗證過濾器和授權過濾器來實現(有關在此處實現它們的更多詳細資訊)。
WebAPI 中的每個請求首先由處理程序處理,然後在執行請求的操作之前應用過濾器。對於您的範例,身份驗證過濾器將保存
DoLogin功能,user.hasPermission邏輯將駐留在授權過濾器中,並且只有操作邏輯將駐留在控制器中的 Action(function) 中。
