Asp.net

跨請求檢索和持久化狀態

  • April 16, 2017

我正在編寫我的第一個 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'))
            {

            }
       }
   }
}

我的問題是,我該如何實現這種功能:

即:

  • 創建一個應用程序上下文,我可以在其中填充上下文敏感資訊,如數據庫連接、郵件配置、對象工廠、雜項狀態資訊等。
  • 訪問使用者對象(我可以添加使用者憑據、權限等)
  • 可以訪問會話變數等嗎?

筆記

  1. 我將在 Linux 上部署 Web 應用程序,並將使用 Apache 作為 Web 伺服器。
  2. 出於本項目的目的,我不想使用任何 Microsoft 技術,如 Azure、Windows 身份驗證等(C# 和 ASP.Net 除外)
  3. 我想使用原始數據庫連接,而不是使用實體管理器(舊應用程序埠)

我有點掙扎,以了解從瀏覽器/前端客戶端向 Web 伺服器發送請求後發生的事件順序。

為此,我會說這個 PDF 海報提供了 ASP.NET WebAPI 中請求處理的最佳圖示。

我的問題是,我該如何實現這種功能:

即:

  • 創建一個應用程序上下文,我可以在其中填充上下文敏感資訊,如數據庫連接、郵件配置、對象工廠、雜項狀態資訊等。
  • 訪問使用者對象(我可以添加使用者憑據、權限等)
  • 可以訪問會話變數等嗎?

為此,我想說,WebAPI 被設計為無狀態的,因此,最好的方法是創建一個持久會話(例如在數據庫中)並為每個請求使用會話標識符(如會話密鑰或令牌)來辨識使用者並獲取他的會話變數/上下文資訊。

現在,為了實現您在範例中要求的那種功能,可以通過組合身份驗證過濾器和授權過濾器來實現(有關在此處實現它們的更多詳細資訊)。

WebAPI 中的每個請求首先由處理程序處理,然後在執行請求的操作之前應用過濾器。對於您的範例,身份驗證過濾器將保存DoLogin功能,user.hasPermission邏輯將駐留在授權過濾器中,並且只有操作邏輯將駐留在控制器中的 Action(function) 中。

在此處輸入圖像描述

引用自:https://stackoverflow.com/questions/33944557