Come utilizzare o gestire gli SDK lato server non progettati per la concorrenza in ASP.NET Core 2.1 con Razor Pages

asp.net-core blazor c#

Domanda

Aggiornamento: Come da sua richiesta, la seguente è una spiegazione più chiara di ciò che sto cercando di ottenere, e una descrizione del contesto in cui sto lavorando.

In sostanza, sto creando un sito Web utilizzando ASP.NET Core 2.1 con il framework Razor Pages, configurato interamente con l'impostazione predefinita per tutto. La nota importante è che ho bisogno di utilizzare un provider esterno specifico come servizio di gestione dei dati dell'app e quindi non solo di implementare un database con ASP.NET. Per questo motivo, nel codice lato server per la maggior parte delle pagine, sto utilizzando un SDK client per detto servizio di gestione perché è più facile interagire con un'API REST. Il problema è che sto incontrando problemi di concorrenza dovuti al fatto che l'SDK è stato progettato per essere utilizzato con una sessione alla volta e quindi espone proprietà statiche contenenti i dati di sessione come "l'utente corrente". Quello che sto chiedendo è come sia possibile creare una nuova esecuzione o dominio di memoria per ogni sessione che viene creata, in modo che ognuno possa avere il proprio "utente corrente", o come altrimenti risolvere l'incubo di concorrenza che emerge quando un SDK viene utilizzato progettato per far sì che il client abbia a che fare con un utente e / o una sessione alla volta nell'intero backend. Le mie note precedenti su Blazor in cui tentavo di descrivere l'analogo più semplice per quello che penso potrebbe essere una soluzione a questo problema. Ho sentito parlare della memorizzazione dei dati di sessione; tuttavia, per quanto ne so, tutto deve essere serializzato su JSON e memorizzato in un file da qualche parte, il che non funziona per me dato che i dati potrebbero essere riservati.

Vecchia spiegazione (ancora un po 'pertinente): sto creando un sito web alimentato da ASP.NET Core 2.1 e sto tentando di utilizzare un SDK progettato per essere utilizzato su un AppDomain che è univoco per una specifica istanza e / o sessione dell'applicazione; ciò significa che l'SDK ha più API che espongono i membri di archiviazione dei dati (campi, proprietà, ecc.) che sono statici. In termini di utilizzo di tale SDK con ASP.NET Core, questa struttura dell'esposizione sembra essere un problema perché il runtime alloca solo un singolo AppDomain , sul lato server, per tutte le sessioni collettivamente, e quindi possibilmente più utenti separati, condividere. Se non ho accesso all'origine di questo SDK e / o non può essere modificato, per scopi legati all'agnosticismo della piattaforma, come faccio a utilizzare l'SDK correttamente senza solo essere in grado di memorizzare i dati per una sessione alla volta. Ecco una versione semplificata di ciò con cui sto lavorando:

API di esempio:

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++;
    }
}

Supponiamo che le variabili statiche vengano utilizzate anche altrove nell'SDK.

Quindi, in pratica, se l'API sopra fosse reale, come la userei in ASP.NET Core, in modo che ogni sessione avesse la sua intera copia dell'SDK da usare, comprese le variabili statiche specifiche della sessione. Se possibile, sto cercando qualcosa di simile a come sia possibile creare un assembly "Client" Blazor, che abbia un nuovo AppDomain per ogni sessione e un assembly "Server", anche se capisco che la soluzione implementata da Blazor potrebbe non essere applicabile considerando che ha un runtime locale per browser attivo, mentre ASP.NET Core non lo fa. Scenario peggiore, l'API può essere modificata, ma deve ancora essere indipendente dalla piattaforma per la maggior parte delle estensioni. Grazie in anticipo per tutto l'aiuto.

Risposta popolare

Ho un momento difficile per capire il tuo problema. Ma penso che il problema sia una certa confusione su Blazor, ma correggimi se sbaglio.

"creare un assembly" Client "Blazor, che ha un nuovo AppDomain per ogni sessione"

Quindi Blazor è un build SPA lato client su .NET e esegue WebAssembly nel browser. Quindi tecnicamente non hai "sessioni" classiche, niente cookie di sessione, niente. E difensivamente non più, perché l'intero contesto è nella memoria del browser utilizzato da un singolo utente. Pensa a Blazor come una JS SPA, ad esempio l' Angular o la React App. SPA generalmente utilizzate con API (stateless) che possono essere autorizzate o meno. Puoi fare lo stesso qui. Basta acquisire un token (OAuth2) e passarlo alla tua API. Ecco un codice di esempio che fa qualcosa di simile a un oggetto utente di quanto non stavi chiedendo: UserModel.cs ed ecco il codice ApiClient.cs del client autorizzato.

Se vuoi pensare in "sessioni" e nel modo classico. Tecnicamente la sessione è nella memoria del browser, stato SPA. La durata della sessione è il tempo di scadenza del token. Ma è lo stesso con ogni applicazione SPA non importa se è JS o Blazor.

Spero che questo aiuti e risponda alla tua domanda.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché