Comment utiliser ou traiter des kits de développement logiciel côté serveur non conçus pour la concurrence dans ASP.NET Core 2.1 avec Razor Pages

asp.net-core blazor c#

Question

Mise à jour: comme il est demandé, ce qui suit est une explication plus claire de ce que j'essaie de réaliser et une description du contexte dans lequel je travaille.

Pour l’essentiel, je crée un site Web en utilisant ASP.NET Core 2.1 avec le framework Razor Pages, entièrement configuré avec la configuration par défaut pour tout. La remarque importante est que je dois utiliser un fournisseur externe spécifique en tant que service de gestion de données de l'application et que je ne peux donc pas simplement implémenter une base de données avec ASP.NET. C'est pourquoi, dans le code côté serveur de la plupart des pages, j'utilise un kit de développement logiciel client pour ledit service de gestion, car il est plus facile d'interagir avec une API REST. Le problème est que je rencontre des problèmes de simultanéité en raison du fait que le SDK a été conçu pour être utilisé avec une session à la fois et expose donc des propriétés statiques contenant les données de session telles que "l'utilisateur actuel". Ce que je demande, c’est de quelle manière je pourrais éventuellement créer un nouveau domaine d’exécution ou de mémoire pour chaque session créée, afin que chacune d’entre elles puisse avoir son propre "utilisateur actuel", ou comment je pourrais autrement résoudre le cauchemar de la simultanéité qui se produit lorsqu'un SDK est utilisé pour que le client ne traite qu'avec un utilisateur et / ou une session à la fois dans tout le backend. Dans mes notes précédentes sur Blazor, je tentais de décrire l'analogue le plus simple pour ce qui, à mon avis, pourrait constituer une solution à ce problème. J'ai entendu parler du stockage des données de session. cependant, autant que je sache, tout doit être sérialisé en JSON et stocké dans un fichier quelque part, ce qui ne fonctionne pas pour moi car les données peuvent être confidentielles.

Ancienne explication (toujours un peu pertinente): Je crée un site Web basé sur ASP.NET Core 2.1 et tente d'utiliser un SDK conçu pour être utilisé sur un AppDomain propre à une instance d'application et / ou à une session spécifique; Cela signifie que le SDK dispose de plusieurs API exposant les membres de stockage de données (champs, propriétés, etc.) statiques. En termes d'utilisation d'un tel SDK avec ASP.NET Core, cette structure d'exposition semble poser problème, car le moteur d'exécution n'alloue qu'un seul AppDomain , côté serveur, pour toutes les sessions de manière collective, et donc éventuellement pour plusieurs utilisateurs distincts. partager. Si je n'ai pas accès à la source de ce SDK et / ou s'il ne peut pas être modifié, pour des raisons liées à l'agnosticisme de plate-forme, comment puis-je utiliser le SDK avec succès sans pouvoir uniquement stocker les données d'une session à la fois. Voici une version simplifiée de ce avec quoi je travaille:

Exemple d'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++;
    }
}

Supposons que les variables statiques sont également utilisées ailleurs dans le SDK.

En résumé, si l'API ci-dessus était réelle, comment l'utiliser dans ASP.NET Core afin que chaque session dispose de sa propre copie complète du SDK, y compris des variables statiques propres à la session. Si possible, je cherche quelque chose comme la possibilité de créer un assemblage Blazor "Client", doté d'un nouvel AppDomain pour chaque session et d'un assemblage "Serveur", bien que je sache que la solution mise en œuvre par Blazor peut ne pas être applicable. considérant que son runtime local au navigateur est également actif, contrairement à ASP.NET Core. Dans le pire des cas, l'API peut être modifiée, mais elle doit toujours être indépendante de la plate-forme dans la plupart des cas. Merci d'avance pour toute aide.

Réponse populaire

J'ai du mal à comprendre votre problème. Mais je pense que le problème est une certaine confusion sur Blazor, mais corrigez-moi si je me trompe.

"crée un assemblage" Client "Blazor, qui a un nouvel AppDomain pour chaque session"

Blazor est donc un SPA client construit sur .NET et exécute WebAssembly dans le navigateur. Donc, techniquement, vous n'avez pas de "sessions" classiques, pas de cookie de session, rien. Et, défensivement, pas plusieurs parce que tout le contexte est dans la mémoire du navigateur utilisée par un seul utilisateur. Pensez à Blazor comme un SPA JS, par exemple Angular ou React App. Les SPA généralement utilisés avec des API (sans état) pouvant être autorisées ou non. Vous pouvez faire la même chose ici. Il suffit d’acquérir un jeton (OAuth2) et de le transmettre à votre API. Voici un exemple de code faisant quelque chose de similaire avec un objet utilisateur que vous ne le demandiez: UserModel.cs et voici le code du client autorisé ApiClient.cs .

Si vous voulez penser en "sessions" et de manière classique. Techniquement, la session est dans la mémoire du navigateur, état SPA. La durée de vie de la session est l'heure d'expiration du jeton. Mais il en va de même avec chaque application SPA, qu’il s’agisse de JS ou de Blazor.

J'espère que cela aide et répond à votre question.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi