gpt4 book ai didi

c# - 如何在带有 Razor Pages 的 ASP.NET Core 2.1 中使用或处理并非为并发而设计的服务器端 SDK

转载 作者:行者123 更新时间:2023-11-30 23:01:33 27 4
gpt4 key购买 nike

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

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

旧解释(仍然有些相关):我正在创建一个由 ASP.NET Core 2.1 提供支持的网站,并尝试使用旨在用于 AppDomain 的 SDK。对于一个特定的应用程序实例和/或 session 是唯一的;这意味着 SDK 有多个 API,这些 API 公开静态的数据存储成员(字段、属性等)。就将此类 SDK 与 ASP.NET Core 一起使用而言,此公开结构似乎是一个问题,因为运行时仅分配一个 AppDomain。 ,在服务器端,所有 session 共同共享,因此可能有多个单独的用户共享。如果我无权访问此 SDK 的源代码和/或无法更改它,出于与平台不可知论相关的目的,我如何成功使用 SDK 而不能一次只能存储一个 session 的数据。这是我正在使用的简化版本:

示例 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 中使用它,以便每个 session 都有自己的 SDK 的完整副本供使用,包括特定于 session 的静态变量。如果可能的话,我正在寻找类似如何创建 Blazor“客户端”程序集的方法,它有一个新的 AppDomain。对于每个 session 和一个“服务器”程序集,尽管我知道 Blazor 实现的解决方案可能不适用,因为它也有一个浏览器本地运行时处于事件状态,而 ASP.NET Core 则没有。最坏的情况是,可以修改 API,但它在很大程度上仍必须与平台无关。预先感谢所有帮助。

最佳答案

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

"create a Blazor "Client" assembly, that has a new AppDomain for every session"

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

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

我希望这对您有所帮助并回答您的问题。

更新:自从现在 Blazor 正式与 .NET Core 3.1 一起可用后,您应该阅读 Microsoft Balzor Authentication .

关于c# - 如何在带有 Razor Pages 的 ASP.NET Core 2.1 中使用或处理并非为并发而设计的服务器端 SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51001923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com