【问题标题】:How to keep data in memory (session) while ASP.NET application is running?ASP.NET 应用程序运行时如何将数据保存在内存(会话)中?
【发布时间】:2019-10-27 19:46:18
【问题描述】:

我需要开发一个简单的 ASP.NET 应用程序,它允许在餐厅中显示客户订单,在表中添加和删除订单。我遇到的问题是,只要应用程序正在运行,我被指示不要使用任何数据库并将所有数据存储在内存(会话)中。

我是 C# 和 ASP.NET 的初学者,如果没有实际的数据库,我很难弄清楚如何做到这一点(我有 Java 和 Spring MVC 的经验,但我只是用数据库制作应用程序,所以我没有任何制作将数据保存在内存中的网络应用程序的经验)。

无论我怎么想,如果我创建一个新订单并将其添加到具有添加订单表单的视图中的列表中,我如何确保我创建的相同列表将在我移动到显示列表的视图。它是一个不同的控制器,因此它似乎无法访问我在另一个控制器中创建的 List 对象。有什么办法可以解决这个问题吗?

【问题讨论】:

  • 不使用任何数据库并将所有数据存储在内存(会话)中。您可能会扭曲此约束并使用某种进程内数据库。但那将是愚蠢的。就像不使用数据库来存储这些东西的想法一样。如果 IIS 进程崩溃(如果你用完它存储这些东西的所有内存,它会崩溃),你就会失去所有的订单。这是一个坏主意,绝对不会扩展。
  • ..当然,您可以将列表发布到下一个控制器,该控制器只会将其呈现(保存)隐藏在下一页上。但这也是一个坏主意,因为当网页消失时,您的列表就会丢失
  • 是的,不将这些数据写回数据库或其他存储系统将会非常失败。 .NET 是出了名的吝啬 RAM,存储大量此类数据将失败。特别是在 Web 应用程序中。你需要把这个工作卸载到别的事情上。 |如果这是关于安全/在重新启动时清理数据,您可以将数据库文件放在 Ramdisk 上。相同级别的安全性,没有任何问题。但最好的办法是问为什么你不使用数据库。有 95% 的机会,这只是一个什么都不知道的人的决定。
  • 这只是一个excersize。他们希望我们专门使用会话/内存来存储数据。我读到如果内存用完并导致应用程序崩溃,所有数据都会消失,但这只是一个介绍。我正在做我被告知的事情,因为任何其他解决方案都不会被接受为正确答案。它需要通过将数据保存在内存中来完成。我只是想知道如何做到这一点,并能够将在一个页面中创建的对象传递到将显示这些对象的另一个页面。
  • "如何确保在移动到显示列表的视图后显示我创建的相同列表"...会话对象在当前使用的所有视图和操作中持续存在用户,直到会话结束(例如,因为超时,或用户关闭浏览器)。每个用户都有自己的 Session 对象。 stackoverflow.com/questions/14138872/… 有一个简单的入门示例

标签: c# asp.net


【解决方案1】:

评论是对的,但无论如何您都可以使用不同的解决方案(单例服务、会话、静态属性)来实现这一点

在启动时:

services.AddSingleton<OrdersManager>();

OrdersManager 类或其他:

public class OrdersManager 
{
    public OrdersManager()
    {
        OrdersById = new ConcurrentDictionary<string, Order>();
    }

    private ConcurrentDictionary<string, Order> OrdersById { get; }

    public void AddOrder()
    {
        OrdersById.TryAdd(...);
    }

    ... All others usefull methods
}

无论您在哪里可以调用 OrdersManager:

var manager = serviceProvider.GetService(typeof(OrdersManager));
manager.AddOrder(new Order(...));

这只是众多可能实现之一的示例。

【讨论】:

    【解决方案2】:

    我认为您应该支持持久存储。你可以使用SQLLite 甚至是一个文件。

    对于内存数据库,您可以使用:

    这是一个示例连接字符串 SQLLite,请注意.InMemory 位。

    @"Server=(localdb)\mssqllocaldb;Database=EFProviders.InMemory;Trusted_Connection=True;ConnectRetryCount=0");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      相关资源
      最近更新 更多