为什么我的HttpContext.应用程序变量不能通过ASP中的不同操作访问.净MVC

本文关键字:操作 访问 MVC ASP 应用程序 HttpContext 我的 变量 不能 为什么 | 更新日期: 2023-09-27 18:18:21

我创建了一个asp.net MVC程序,我希望一些变量可以共享给每个访问者。
我在Global.asax:

中输入了一些代码
protected void Application_Start(){ 
    SMEQueue[] SMEtime = new SMEQueue[10];
    Application["waittime"] = SMEtime;
...
但是,

不能在Application中修改数组。我可以在控制器的每个动作中读取它,像这样:

SMEQueue[] arr = System.Web.HttpContext.Current.Application["waittime"] as SMEQueue[];

,但在我改变数组中的值在一个动作,我得到的其他动作仍然是在Global.asax分配的原始数组。修改不能传递给其他动作。
为什么?我能做什么?
我发现在stackoverflow上有很多类似的问题,遗憾的是他们的答案并不适合我。


更多代码:
在Action中编辑变量:

public ActionResult Create()
    {
        SMEQueue[] arr = System.Web.HttpContext.Current.Application["waittime"] as SMEQueue[];
        arr[0] = new SMEQueue("hello");//elements of arr are null before

然后从另一个Action:

访问它
public ActionResult TryConnect()
    {
        SMEQueue[] arr = System.Web.HttpContext.Current.Application["waittime"] as SMEQueue[];
        Request.Write(arr[0].ToString());//it' null.

如果我在Application_Start()中给一个变量赋值,我可以在任何地方(任何action)访问该值。但是在我修改任何动作的值之后,我在其他动作中读到的仍然是在Application_Start()中分配的值。

为什么我的HttpContext.应用程序变量不能通过ASP中的不同操作访问.净MVC

您首先需要了解应用程序对象通常不止创建一次。因此,不同的请求很可能使用不同的Application对象。因此,一个Action可以读取启动值而不是修改值是有道理的,因为它们是由不同的Application对象处理的。

应用程序状态的缺点:

应用范围应用状态的范围也可以是a劣势。存储在应用程序状态中的变量仅对应用程序正在运行的特定进程,以及每个应用程序进程可以有不同的值。因此,你不能依赖应用程序状态来存储唯一值或更新全局Web-garden和Web-farm服务器配置中的计数器。

ASP。. NET状态管理建议

你可能会遇到的一个经典的例子是IIS关闭你的应用程序,因为默认情况下是20分钟。当下一个请求到达服务器时,一个新的工作进程将使用一个新的Application对象和状态启动。

所以基本上,如果你需要在单个会话和应用程序之外维护状态,你需要某种形式的状态持久化,通常是一个数据库,你也可以通过它来写/读。

我将使用:

  • HttpContext for short - lived per user per request storage
  • cookie用于长时间的每用户多请求存储
  • 缓存长时间的多用户,多请求数据
  • 全局查找数据的应用状态(每日,每周,每月),记住你必须管理从旧数据到新数据的逐步下降,旋转。
  • 最后到达数据库或其他一些有效的读/写介质类型的事情,你似乎试图做/页面计数器等。

要测试所有这些,只需在Application_Start代码中放置一个断点,并查看它被击中的次数,每次它都有一个新的应用程序对象在运行....此外,在VS的调试窗口中查看你的线程可以提供信息。