Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么无法通过ASP.NET MVC中的不同操作访问我的HttpContext.Application变量_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 为什么无法通过ASP.NET MVC中的不同操作访问我的HttpContext.Application变量

C# 为什么无法通过ASP.NET MVC中的不同操作访问我的HttpContext.Application变量,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我创建了一个aspnet mvc程序,我希望一些变量可以共享给每个访问者。 我在Global.asax中键入了一些代码: protected void Application_Start(){ SMEQueue[] SMEtime = new SMEQueue[10]; Application["waittime"] = SMEtime; ... 但是,我无法在应用程序中修改数组。我可以在Contyller的每一个动作中看到它,如下所示: SMEQueue[] arr = S

我创建了一个aspnet mvc程序,我希望一些变量可以共享给每个访问者。
我在Global.asax中键入了一些代码:

protected void Application_Start(){ 
    SMEQueue[] SMEtime = new SMEQueue[10];
    Application["waittime"] = SMEtime;
...
但是,我无法在应用程序中修改数组。我可以在Contyller的每一个动作中看到它,如下所示:

SMEQueue[] arr = System.Web.HttpContext.Current.Application["waittime"] as SMEQueue[];
但是当我在一个动作中更改数组中的值后,我在其他动作中得到的仍然是Global.asax中指定的原始数组。修改不能传递到其他操作。
为什么?我能做什么?
我发现在stackoverflow上有很多类似的问题,遗憾的是,他们的答案对我来说并不适用


更多代码:
我在操作中编辑变量:

public ActionResult Create()
    {
        SMEQueue[] arr = System.Web.HttpContext.Current.Application["waittime"] as SMEQueue[];
        arr[0] = new SMEQueue("hello");//elements of arr are null before
然后我从另一个操作访问它:

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


如果我在Application_Start()中为变量赋值,我可以在任何地方(任何操作)访问该值。但是在我修改任何操作中的值之后,我在其他操作中读取的仍然是在Application_Start()中指定的值。

您首先需要了解,应用程序对象通常会被创建多次。因此,不同的请求可能使用不同的应用程序对象。因此,一个操作可能是读取启动值,而不是修改后的值,因为它们由不同的应用程序对象处理

应用程序状态的缺点:

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

您可能会遇到的一个典型示例是,由于不活动(我认为默认情况下是20分钟),IIS会关闭您的应用程序。当下一个请求到达服务器时,一个新的工作进程将与一个新的应用程序对象一起旋转,从而进入状态

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

我将使用:

  • HttpContext用于每个用户每个请求的短期存储
  • 用于长寿命单用户多请求存储的Cookie
  • 用于长寿命多用户、多请求数据的缓存
  • 全局查找数据的应用程序状态不太重要(每天、每周、每月),请记住,您必须管理从旧数据到新数据的向下调整、向上旋转
  • 最后,联系数据库或其他有效的读/写媒体,了解您似乎要做的事情/页面计数器等

要测试所有这些,只需在应用程序的启动代码上设置一个断点,并查看它被命中的次数,每次都是一个新的应用程序对象。。。。另外,在VS的调试窗口中查看线程可以提供信息。

能否显示一些修改数组的代码?请确保在更改变量之前锁定应用程序对象我创建了一个简单的应用程序,一切正常。您能否提供更多关于您使用哪些控制器的信息(控制器、ApiController、Async,它们是否位于一个库中)?另外,请将断点设置为Application_Start,并检查应用程序是否只创建了一次。(请确保使用一个应用程序实例。在某些情况下,另一个应用程序实例正在创建,例如,当您删除IIS目录列表观察到的文件或目录、更改web.config等)。