【问题标题】:Why doesn't ASP.NET TempData work when modifying Web.config?为什么修改 Web.config 时 ASP.NET TempData 不起作用?
【发布时间】:2017-02-09 12:19:26
【问题描述】:

如果需要,我的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

正如我最初所期待的那样。

(我有几个例子得到了相反的结果,但通常是在我评论或取消评论该行之后的第一个请求,所以可能是I should blame caching。)

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 因为当 IIS 检测到配置文件的更改时,它会回收应用程序池,从而擦除所有会话数据。不过,我想不出你为什么要在运行时动态更改 web.config 的任何充分理由 - 所以我会考虑解决这个问题。
  • @AntP 好的,有道理。是的,这绝对是一个黑客。您可以将其发布为答案吗?

标签: c# asp.net asp.net-mvc tempdata


【解决方案1】:

基于这个问题:

What happens when I edit web.config?

想象每个 ASP.NET 应用程序(在 IIS 中定义)都是一个程序 桌面。保存 web.config 将执行类似于关闭的操作 该程序并重新打开它。 - 丹·戈尔茨坦

当在运行时对 web.config 文件进行任何更改时,IIS 默认行为会自动重置整个会话状态并回收现有的 AppDomain,因此存储在 TempData 数组中的所有值都将丢失,而是保留空值。

config.Save 行未注释时,该行:

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

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

throw new Exception(null);

由于as 运算符在对象不存在时返回 null,因此它会抛出带有 null 字符串的新 Exception 实例,从而导致显示默认异常消息而不是自定义异常消息。

如果注释了config.Save 行,则配置更改不会应用到 web.config 文件中,因此现有的AppDomain 仍然运行并且TempData 值仍然存在。

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

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

相关问题:How to prevent an ASP.NET application restarting when the web.config is modified?

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 2014-10-06
      • 2022-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2016-07-15
      • 2016-07-06
      相关资源
      最近更新 更多