繁体   English   中英

如何在带有 Razor 页面的 ASP.NET Core 2.1 中使用或处理不是为并发而设计的服务器端 SDK

[英]How to Use or Deal With Server-Side SDKs not Designed for Concurrency in ASP.NET Core 2.1 with Razor Pages

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

本质上,我正在使用 ASP.NET Core 2.1 和 Razor Pages 框架制作一个网站,完全使用默认设置配置所有内容。 重要的一点是,我需要使用特定的外部提供程序作为应用程序的数据管理服务,因此不能仅使用 ASP.NET 实现数据库。 因此,在大多数页面的服务器端代码中,我将客户端 SDK 用于所述管理服务,因为它比 REST API 更易于交互。 问题是我遇到了并发问题,因为 SDK 被设计为一次与一个会话一起使用,因此公开了包含会话数据的静态属性,例如“当前用户”。 我要问的是如何为每个创建的会话创建一个新的执行或内存域,以便每个会话都可以拥有自己的“当前用户”,或者我如何解决 SDK 出现的并发噩梦使用旨在让客户端在整个后端一次只处理一个用户和/或会话。 我之前关于 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,但它仍然必须在很大程度上与平台无关。 在此先感谢所有帮助。

我很难理解你的问题。 但我认为这个问题是关于 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 身份验证的信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM