为什么不'. NET TempData在修改Web.config时起作用

本文关键字:Web 修改 config 起作用 TempData NET 为什么不 | 更新日期: 2023-09-27 18:09:39

我在Global.asax.cs文件中有一个函数,如果需要的话,它可以对Web.config文件进行一些更改。文件保存为:

config.Save(ConfigurationSaveMode.Modified);

我最近发现TempData不为我的应用程序工作:它似乎是空的下一个请求。我的MCVE:

public ActionResult Foo()
{
  TempData["error"] = "testing error passing";
  return RedirectToAction("Bar");
}
public ActionResult Bar()
{
  throw new Exception(TempData["error"] as string);
}

我将它添加到我的HomeController,访问/Home/Foo将重定向到/Home/Bar。但是,由于上面的config.Save行处于活动状态,我得到:

Server Error in '/' Application.
Exception of type 'System.Exception' was thrown.

但是如果我注释掉那行,我得到:

Server Error in '/' Application.
test error passing

如我所愿。

(我有几个实例,我得到了相反的结果,但它通常是在我注释或取消注释后的第一个请求,所以可能我应该责怪缓存。)

为什么会发生这种情况,我该如何修复它?

为什么不'. NET TempData在修改Web.config时起作用

根据这个问题:

当我编辑web.config时会发生什么?

想象每个ASP。. NET应用程序(如IIS中定义的)是一个程序桌面。保存网络。Config将做一些类似于关闭的事情然后重新启动程序。——丹·戈德斯坦

IIS默认行为自动重置整个会话状态,并在任何更改应用于web时回收现有的AppDomain。因此,存储在TempData数组上的所有值都将丢失,取而代之的是空值。

config.Save行未注释时,

throw new Exception(TempData["error"] as string);

将包含来自TempData["error"]的空值:

throw new Exception(null);

由于as操作符返回null如果对象不存在,它抛出新的Exception实例与空字符串,导致默认异常消息显示,而不是自定义的。

如果config.Save行被注释,则配置更改不会应用到web中。因此,现有的AppDomain仍然在运行,TempData的值仍然在原地。

默认行为可以通过以下步骤进行更改:

  1. 打开IIS管理器。
  2. 选择应用程序池=>[您的应用程序池名称]=>高级设置
  3. 在回收区域,找到Disable Recycling for Configuration Changes (DisallowRotationOnConfigChange)部分并将其设置为True

相关问题:如何防止ASP。. NET应用程序重新启动时web。配置被修改?

TempData将值存储在会话中,似乎您的默认会话存储是InProc,它将数据存储在服务器内存中,该内存主要在应用程序池的AppDomain下运行

默认情况下,当虚拟目录下的文件发生任何变化时,IIS检测到使用文件监视器并回收应用程序池,这将取消分配给该web应用程序的所有内存。

为了避免这种情况,您可以将会话模式更改为数据库模式或状态服务器模式。

但是最好的事情是完全避免更改web.config,如果您有任何用户定义的配置或需要在运行时更改,那么您必须将其存储在其他地方并缓存以避免任何性能影响