如何使用或处理不是为使用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
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因