为什么不'. 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
如我所愿。
(我有几个实例,我得到了相反的结果,但它通常是在我注释或取消注释后的第一个请求,所以可能我应该责怪缓存。)
为什么会发生这种情况,我该如何修复它?
根据这个问题:
当我编辑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
的值仍然在原地。
默认行为可以通过以下步骤进行更改:
- 打开IIS管理器。
- 选择应用程序池=>[您的应用程序池名称]=>高级设置
- 在回收区域,找到
Disable Recycling for Configuration Changes
(DisallowRotationOnConfigChange
)部分并将其设置为True
。
相关问题:如何防止ASP。. NET应用程序重新启动时web。配置被修改?
TempData将值存储在会话中,似乎您的默认会话存储是InProc,它将数据存储在服务器内存中,该内存主要在应用程序池的AppDomain下运行
默认情况下,当虚拟目录下的文件发生任何变化时,IIS检测到使用文件监视器并回收应用程序池,这将取消分配给该web应用程序的所有内存。
为了避免这种情况,您可以将会话模式更改为数据库模式或状态服务器模式。
但是最好的事情是完全避免更改web.config
,如果您有任何用户定义的配置或需要在运行时更改,那么您必须将其存储在其他地方并缓存以避免任何性能影响