Cómo usar o lidiar con los SDK del lado del servidor que no están diseñados para ser concurrentes en ASP.NET Core 2.1 con Razor Pages

asp.net-core blazor c#

Pregunta

Actualización: De acuerdo con su solicitud, la siguiente es una explicación más clara de lo que estoy tratando de lograr y una descripción del contexto en el que estoy trabajando.

Esencialmente, estoy haciendo un sitio web utilizando ASP.NET Core 2.1 con el marco de Razor Pages, configurado completamente con la configuración predeterminada para todo. La nota importante es que necesito usar un proveedor externo específico como el servicio de administración de datos de la aplicación y, por lo tanto, no puedo implementar una base de datos con ASP.NET. Debido a esto, en el código del lado del servidor para la mayoría de las Páginas, estoy usando un SDK del cliente para dicho servicio de administración porque es más fácil interactuar que una API REST. El problema es que estoy teniendo problemas de concurrencia debido al hecho de que el SDK fue diseñado para ser usado con una sesión a la vez, y por lo tanto expone las propiedades estáticas que contienen los datos de la sesión, como el "usuario actual". Lo que pregunto es cómo podría crear un nuevo dominio de ejecución o memoria para cada sesión que se crea, para que cada uno tenga su propio "usuario actual", o cómo podría resolver la pesadilla de concurrencia que surge cuando un SDK se utiliza y está diseñado para que el cliente solo trate con un usuario o sesión a la vez en todo el backend. Mis notas anteriores sobre Blazor, donde intento describir el análogo más sencillo de lo que creo que podría ser una solución a este problema. He escuchado sobre el almacenamiento de datos de sesión; sin embargo, que yo sepa, todo debe ser serializado a JSON y almacenado en un archivo en algún lugar, lo que no funciona para mí, ya que los datos pueden ser confidenciales.

Explicación anterior (aún algo relevante): estoy creando un sitio web con ASP.NET Core 2.1 y estoy intentando usar un SDK que fue diseñado para ser usado en un AppDomain que es único para una instancia o sesión de aplicación específica; esto significa que el SDK tiene múltiples API que exponen miembros de almacenamiento de datos (campos, propiedades, etc.) que son estáticos. En términos de usar un SDK de este tipo con ASP.NET Core, esta estructura de exposición parece ser un problema porque el tiempo de ejecución solo asigna un único AppDomain , en el lado del servidor, para todas las sesiones de forma colectiva, y por lo tanto posiblemente para múltiples usuarios separados. para compartir. Si no tengo acceso a la fuente de este SDK y / o no se puede cambiar, para fines relacionados con el agnosticismo de la plataforma, ¿cómo uso el SDK correctamente sin poder almacenar los datos de una sesión a la vez? Aquí está una versión simplificada de lo que estoy trabajando con:

API de muestra:

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

Supongamos que las variables estáticas también se utilizan en otras partes del SDK.

Básicamente, si la API anterior fuera real, ¿cómo lo usaría en ASP.NET Core, para que cada sesión tenga su propia copia completa del SDK para usar, incluidas las variables estáticas específicas de la sesión? Si es posible, estoy buscando algo como cómo es posible crear un ensamblaje "Cliente" de Blazor, que tiene un nuevo AppDomain para cada sesión, y un ensamblaje de "Servidor", aunque entiendo que la solución implementada por Blazor puede no ser aplicable teniendo en cuenta que también tiene un tiempo de ejecución local del navegador activo, mientras que ASP.NET Core no lo tiene. En el peor de los casos, la API se puede modificar, pero aún debe ser independiente de la plataforma en la mayoría de los casos. Gracias de antemano por toda la ayuda.

Respuesta popular

Me cuesta entender tu problema. Pero creo que el problema es una confusión con respecto a Blazor, pero corríjame si me equivoco.

"crear un ensamblaje" cliente "de Blazor, que tiene un nuevo dominio de aplicación para cada sesión"

Así que Blazor es una versión SPA del lado del cliente en .NET y ejecuta el Ensamblaje Web en el navegador. Así que técnicamente no tienes "sesiones" clásicas, sin cookie de sesión, nada. Y a la defensiva, no múltiples, porque todo el contexto está en la memoria del navegador que utiliza un solo usuario. Piense en Blazor como un JS SPA, por ejemplo, Angular o React App. Los SPA generalmente se utilizan con API (sin estado) que pueden ser autorizadas o no. Puedes hacer lo mismo aquí. Solo adquiera un token (OAuth2) y páselo a su API. Aquí hay un código de ejemplo que hace algo similar con un objeto de usuario de lo que pedía: UserModel.cs y aquí está el código ApiClient.cs del cliente autorizado.

Si quieres pensar en "sesiones" y de forma clásica. Técnicamente la sesión está en la memoria del navegador, estado SPA. La duración de la sesión es el tiempo de caducidad del token. Pero es lo mismo con cada aplicación de SPA, no importa si es JS o Blazor.

Espero que esto ayude y responda a su pregunta.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué