3

更新:根据它的要求,以下是对我想要实现的目标的更清晰的解释,以及对我工作环境的描述。

本质上,我正在使用带有 Razor Pages 框架的 ASP.NET Core 2.1 创建一个网站,完全使用默认设置进行配置。重要的一点是,我需要使用特定的外部提供程序作为应用程序的数据管理服务,因此不能只使用 ASP.NET 实现数据库。因此,在大多数页面的服务器端代码中,我将客户端 SDK 用于所述管理服务,因为它比 REST API 更容易交互。问题是我遇到了并发问题,因为 SDK 被设计为一次用于一个会话,因此暴露了包含会话数据的静态属性,例如“当前用户”。我要问的是如何为每个创建的会话创建一个新的执行或内存域,这样每个人都可以拥有自己的“当前用户”,或者我如何解决使用 SDK 时出现的并发噩梦,该 SDK 旨在让客户端一次处理一个用户和/或会话整个后端。我之前关于 Blazor 的笔记试图描述我认为可以解决这个问题的最简单的模拟。我听说过存储会话数据;但是,据我所知,所有内容都必须序列化为 JSON 并存储在某个文件中,这对我不起作用,因为数据可能是机密的。我之前关于 Blazor 的笔记试图描述我认为可以解决这个问题的最简单的模拟。我听说过存储会话数据;但是,据我所知,所有内容都必须序列化为 JSON 并存储在某个文件中,这对我不起作用,因为数据可能是机密的。我之前关于 Blazor 的笔记试图描述我认为可以解决这个问题的最简单的模拟。我听说过存储会话数据;但是,据我所知,所有内容都必须序列化为 JSON 并存储在某个文件中,这对我不起作用,因为数据可能是机密的。

旧解释(仍然有些相关):我正在创建一个由 ASP.NET Core 2.1 提供支持的网站,并尝试使用一个 SDK,该 SDK 旨在用于AppDomain一个特定应用程序实例和/或会话所独有的;这意味着 SDK 有多个 API,它们公开静态的数据存储成员(字段、属性等)。就将这样的 SDK 与 ASP.NET Core 一起使用而言,这种暴露结构似乎是一个问题,因为运行时只分配一个单一的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“客户端”程序集、AppDomain每个会话都有一个新程序集和“服务器”程序集之类的东西,尽管我知道 Blazor 实现的解决方案可能不适用,考虑到它还具有活动的浏览器本地运行时,而 ASP.NET Core 没有。在最坏的情况下,可以修改 API,但在大多数情况下它仍然必须与平台无关。提前感谢所有帮助。

4

1 回答 1

3

我很难理解你的问题。但我认为这个问题是关于 Blazor 的一些混淆,但如果我错了,请纠正我。

“创建一个 Blazor “客户端”程序集,每个会话都有一个新的 AppDomain”

Blazor是基于 .NET 构建的客户端 SPA,并在浏览器中运行 WebAssembly。所以从技术上讲,你没有经典的“会话”,没有会话 cookie,什么都没有。而且绝对不是多个,因为整个上下文都在单个用户使用的浏览器内存中。将 Blazor 想象为 JS SPA,例如AngularReact App。SPA 通常与可以授权或不授权的(无状态)API 一起使用。你可以在这里做同样的事情。只需获取 JWT 令牌 (OAuth2) 并将其传递给您的 API。这是一个示例代码,它对用户对象执行的操作与您所要求的类似:UserModel.cs,这是授权客户端ApiClient.cs代码。

如果您想以“会话”和经典方式进行思考。从技术上讲,会话处于浏览器内存中,SPA 状态。会话的生命周期是令牌的到期时间。但无论是 JS 还是 Blazor,每个 SPA 应用程序都是一样的。

我希望这有助于并回答您的问题。

更新:由于现在 Blazor 与 .NET Core 3.1 一起正式可用,您应该阅读有关Microsoft Balzor 身份验证的信息。

于 2018-06-28T14:33:34.660 回答