【问题标题】:ASP.NET 4.8 - How to make class run in its own instance?ASP.NET 4.8 - 如何让类在自己的实例中运行?
【发布时间】:2021-07-30 19:59:37
【问题描述】:

我有一门课,每分钟都有多个用户与之交互。有时这些用户不在美国,因此他们得到的结果与美国用户不同。当我在美国刷新页面时,我发现我的一些结果是针对另一个国家的。我读到 ASP.NET 的 C# 类同时为所有用户运行。这意味着每个人都共享同一个班级。有没有办法为每个用户单独运行一个类的实例?

示例:类的变量因德国用户而更改,然后当我刷新页面时,我的结果是德语。

我希望我的课程保持原样。它是一个包含大量数据的大类。如果有某种方法可以将类保留在实例中并为每个用户重新创建类。请帮我解决这个问题。谢谢。

【问题讨论】:

  • 类和会话数据是正交概念,能否说明你的类是如何实例化的,是否有静态字段,可能有助于我们了解你的问题所在。
  • 同一控制器类的请求之间只共享静态属性
  • 您是否为各种语言环境使用全球化资源,如果是,您如何切换资源?
  • 是的,我使用了很多静态类。这是造成此类问题的原因吗?
  • 第 1 部分:我使用静态类,顺便说一下,这些类都设置在一个主类中。我不使用会话。为了存储一些 cookie,我使用常规的 javascript。但是这个问题不可能来自 js,因为我没有将任何服务器逻辑加载到 js 中。在下面的链接中,您可以看到正在从服务器端填充下拉列表。但由于某种原因,只有第一个元素是正确的。在这张图片中,第一个元素是俄语文本。下一个元素是日语。如果我刷新页面,那么一切都会变成俄语,因为我打开的链接是针对俄语的。不应为此页面加载日语

标签: c# html asp.net class instance


【解决方案1】:

我不明白这怎么会是个问题。每个登录到该站点的用户和您的代码创建该类的一个实例将不会与任何其他用户有任何关系或任何其他关系。现在当然是静态类?好吧,它不会改变,因此对于任何登录到该系统的用户来说,这再一次没有任何用处。

所以我看不到为每个用户创建的类的实例会如何绊倒,并踩到其他用户之上——这实际上根本不可能,也不应该发生。当然,要持久化这样的类,您必须使用 session(),或者在每页的基础上,您可以使用 viewstate。

如前所述,您可能使用静态类 - 但该类中的任何和所有值都将应用于登录到该站点的所有用户 - 这样的静态类不是每个用户,而是整个网站的全局 - 和适用于所有用户。

所以您可能想扩展您如何在每个用户的基础上持久化该类?

如果你正在使用 session() ?好吧,如果您的托管基于服务器场,那么由于可以使用不同的服务器(用于负载平衡和可伸缩性),那么当然您不能在“内存中”使用 session(),因为每个服务器都不能洗牌并将 session() 传递给另一台服务器。在这些情况下,您必须打开基于 SQL 服务器的 session() 管理。一旦完成,这个问题就消失了,因为它现在不是服务器“在内存中”保存这些数据,而是 sql server 为你完成了肮脏的工作。这可能会降低网站速度 - 但我发现这种方法在很大程度上意味着 session() 变得 100% 可靠,甚至代码错误和导致应用程序池重新启动的事情也不会破坏 session() 值。事实上,在我使用的许多服务器上,我遇到了大量的 session() 问题。开启 sql sessions() 不用改一行代码? session() 然后在 100% 可靠的情况下 100% 死亡,并且从未让我失望。甚至网站重新启动 - 坐在页面上的用户似乎仍然可以工作。

那么,您如何持久化为每个用户创建的新类实例?他们是没有逻辑的理由,我可以认为一个 session() 类实例将与任何其他登录用户有任何关系。因此,您可能想要扩展您的现状并一直坚持应该是“每个用户”的类实例

【讨论】:

  • 请任何人,如果你能给我一些将不胜感激的提示。这是我得到的错误的屏幕截图。 servervideos.hopto.org/images/1.jpg 它在下拉列表中加载俄语,然后随机加载其余项目的日语。他们都应该是俄语。如果我刷新,那么它就变成了俄语。这是随机发生的,并且适用于不同的语言。下一次可能是英语或意大利语等等。我所有的语言文本都存储在一个主类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2022-10-26
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多