如何使用或處理不是為使用Razor頁面的ASP.NET Core 2.1中的並發而設計的服務器端SDK

asp.net-core blazor c#

更新:根據它的要求,以下是我想要實現的更清晰的解釋,以及我正在工作的上下文的描述。

基本上,我正在使用帶有Razor Pages框架的ASP.NET Core 2.1創建一個網站,完全配置了所有內容的默認設置。重要的一點是,我需要使用特定的外部提供程序作為應用程序的數據管理服務,因此不能僅使用ASP.NET實現數據庫。因此,在大多數Pages的服務器端代碼中,我使用客戶端SDK來處理所述管理服務,因為它比REST API更容易交互。問題是我遇到了並發問題,因為SDK被設計為一次用於一個會話,因此暴露包含會話數據的靜態屬性,例如“當前用戶”。我要問的是我如何為每個創建的會話創建一個新的執行或內存域,這樣每個人都可以擁有它自己的“當前用戶”,或者我怎麼能解決SDK時出現的並發噩夢使用的目的是讓客戶端在​​整個後端一次處理一個用戶和/或會話。我之前關於Blazor的說明試圖用最簡單的模擬來描述我認為可以解決這個問題的方法。我聽說過存儲會話數據;但是,據我所知,所有內容都必須序列化為JSON並存儲在某個文件中,這對我不起作用,因為數據可能是保密的。

舊解釋(仍然有些相關):我正在創建一個由ASP.NET Core 2.1提供支持的網站,並且我正在嘗試使用專為在一個特定應用程序實例和/或會話所特有的AppDomain上使用的SDK。這意味著SDK具有多個API,這些API公開了靜態的數據存儲成員(字段,屬性等)。在使用這種帶有ASP.NET Core的SDK方面,這種暴露結構似乎是一個問題,因為運行時只在服務器端為所有會話分配一個單獨的AppDomain ,因此可能是多個單獨的用戶,分享。如果我無法訪問此SDK的源代碼和/或無法更改,則出於與平台無關的目的,如何成功使用SDK,而不能一次存儲一個會話的數據。這是我正在使用的簡化版本:

示例API:

public sealed class User
{
    public static User ActiveUser { get; private set; } 

    public static int TotalLogCyclesThisSession { get; private set; } = 0

    public string Username { get; internal set; }

    private string Password { get; internal set; }

    public string Name { get; internal set; }

    public string AccessKey { get; }

    public User(string username, string password)
    {
        /* Populate Instance Properties with Relevant Data */

        ActiveUser = this;
    }

    public void Logout()
    {
        /* Clear Data from Settable Instance Properties */

        ActiveUser = null;
        TotalLogCyclesThisSession++;
    }
}

假設靜態變量也在SDK的其他地方使用。

基本上,如果上面的API是真實的,我將如何在ASP.NET Core中使用它,以便每個會話都有自己的SDK的整個副本,包括特定於會話的靜態變量。如果可能的話,我正在尋找類似於如何創建Blazor“Client”程序集,每個會話都有一個新的AppDomain以及“Server”程序集的東西,儘管我知道Blazor實現的解決方案可能不適用考慮到它的瀏覽器本地運行時也是活動的,而ASP.NET Core則沒有。在最壞情況下,API可以被修改,但它仍然必須與大多數範圍的平台無關。在此先感謝您的幫助。

熱門答案

我很難理解你的問題。但我認為這個問題對Blazor來說有些混亂,但如果我錯了,請糾正我。

“創建一個Blazor”客戶端“程序集,每個會話都有一個新的AppDomain”

所以Blazor是一個基於.NET的客戶端SPA構建,並在瀏覽器中運行WebAssembly。所以從技術上講,你沒有經典的“會話”,沒有會話cookie,沒有。並且防禦性地不是多個,因為整個上下文位於單個用戶使用的瀏覽器內存中。想想Blazor就像JS SPA,例如AngularReact App。 SPA通常與(無狀態)API一起使用,可以授權或不授權。你可以在這裡做同樣的事情。只需獲取一個令牌(OAuth2)並將其傳遞給您的API。下面是一個示例代碼,它使用與用戶對像類似的東西: UserModel.cs ,這裡是授權客戶端ApiClient.cs代碼。

如果你想以“會話”和經典的方式思考。從技術上講,會話處於瀏覽器內存SPA狀態。會話的生命週期是令牌的到期時間。但是如果是JS或Blazor,那麼每個SPA應用都是一樣的。

我希望這有助於解答你的問題。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow