【问题标题】:ASP.Net Inproc session restarted after markup change in VS2012ASP.Net Inproc 会话在 VS2012 中的标记更改后重新启动
【发布时间】:2012-10-27 16:16:01
【问题描述】:

我将我的开发机器升级到了 Windows 8 和 Visual Studio 2012。

我正在本地 IIS 上测试我的 ASP.Net 应用程序(也升级到 .net 4.5)。

让我烦恼的一件事是,在我的上一个配置(Windows 7、VS 2010、.net 4.0)中不是这样的,是在标记文件更改后重新启动 InProc 会话。

示例:我登录到我的本地 ASP.net 应用程序,在 *.ascx 文件中进行更改并保存,刷新我的网络浏览器,会话就消失了。

如何关闭会话重启问题?

编辑: 我尝试使用新的 VS 2012 Web 应用程序项目模板重现该问题,删除了不必要的内容并且无法重现此问题。

但是,在我的实际项目中,问题仍然存在:更改 aspx 或 ascx 文件会导致 Application_Start 事件被触发。

我还将实际项目中的 web.config 精简到最低限度,使其看起来像新项目中的那样,但这也不允许我删除错误。我在 web.config 中注释掉的内容是 DevExpress Controls、自定义 healthMonitoring、IIS UrlRewrite 2

Applicationpool as Integrated, v4.0 with NetworkService as Identity

【问题讨论】:

标签: c# asp.net windows-8 iis-7.5 visual-studio-2012


【解决方案1】:

我不打算为此而努力,但答案隐藏在 @Anand 对原始问题的第 11 条评论中:

在 web.config 中添加这个键:

<appSettings><add key="PageInspector:ServerCodeMappingSupport" value="Disabled" /></appSettings>

问题就消失了。 VS 也变得更加敏感。唯一的缺点是您失去了 Page Inspector 的服务器端诡计。

希望 MS 能尽快提供修复..

【讨论】:

  • 添加这个键实际上解决了这个问题。我也希望 MS 尽快修复此解决方法,并且有相同问题的其他开发人员可以从 Anand 的回答中受益。
  • 我很好奇,你遇到过同样的问题吗?
  • 是的——我的头发已经拔了几个星期了!最糟糕的部分是它也会在同一台机器上弄乱 VS2010,我猜是因为安装到 IIS 中的钩子。
  • 是的。我们正在积极解决此问题以正确修复它。修复将在 VS 2012 的未来更新中提供。
  • @Anand 还有什么可能导致这个问题的吗?在从 vs2010 转换的项目中,我在 vs2013 中遇到了同样的事情。此外,该项目可能从 .NET 1.1 升级到 .NET 3.5。我尝试了上面的应用程序设置,但对我的情况没有帮助。奇怪的是,它只发生在某些项目上。我有几个项目采用相同的迁移路径,我能够很好地进行标记更改。
【解决方案2】:

这里的问题是您的应用程序正在进行动态编译,这意味着对标记文件的任何更改都会导致应用程序重新启动。如您所知,任何应用程序重新启动都会转储 InProc 会话。

本地模板上的“Web 应用程序”设置不同,因此它不会重新启动整个应用程序。不过,进行预编译有一些好处。

有几种方法可以解决这个问题。

为什么会这样

默认情况下,ASP.NET 4.5 允许您同时运行“网页”和“Web 应用程序”。这可能是导致对 aspx 进行更改以触发预编译的原因(每次发生更改时“网页”都必须这样做)。 更多信息在这里: http://msdn.microsoft.com/en-us/library/dd547590.aspx

在新版本中还有不少优化web服务器的改动。您可以在此处查看这些更改的详细信息,它们还可以在您升级时解释更改。 http://www.asp.net/vnext/overview/aspnet/whats-new

无论如何,解决方案仍然相同,并且不建议即时更新单个 aspx 文件。如果这是不可避免的,那么在任何设置中最终都会发生重新启动,因此无论如何都值得使用以下解决方案之一。

解决方案

编译模式

检查您的 web.config 中的 CompilationMode。有关更多信息,请查看此帖子 http://www.campusmvp.net/compilationmode-avoiding-aspx-page-compilation-to-improve-scalability-in-sites-with-thousands-of-pages/

这也可以在服务器级别设置,以便您可以根据环境获得差异。

会话状态模式

您可以在 StateServer 模式下或使用 Sql server 运行会话状态。如果安装了 .net,则 ASP.NET 状态服务器将位于您的服务器上,只需将其设置为自动启动。然后你可以在配置中切换它。

<sessionState mode="StateServer" useHostingIdentity="true" cookieless="false" timeout="120" stateConnectionString="tcpip=127.0.0.1:42424" />

我们总是使用 ASP.NET 状态服务器进行开发,在许多情况下用于生产。 我发现在测试较长的用户路径(例如具有许多表单的表单向导)时,每次重建时都会破坏会话非常烦人。这也意味着您不会在应用重启时丢失会话。

你也可以用同样的方式使用SQL server。

注意:您必须记住,如果您将类序列化为会话状态并进行更改,则需要手动重新启动状态服务器,否则您将收到序列化错误。这是非常罕见的,但只是在生产环境中要注意。

【讨论】:

  • 感谢您指出编译模式的问题。显然“从不”是行不通的。我尝试了“自动”,它让我在更改后运行 2-3 个请求,但随后应用程序没有错误地结束(Server.GetLastError() 为空)并且 Application_Error 没有触发。将 CompilationMode 设置为远离默认值(在 4.0 和 4.5 之间没有改变)对我没有任何好处。令人沮丧的是,我真的很想知道是什么导致了升级过程中的重大变化。
  • 看看为什么会这样。我 90% 确定这就是升级到 4.5 时行为发生变化的原因。以前它是网页和网络应用程序之间的一种或另一种。
【解决方案3】:

当使用进程内模式时,您的会话数据托管在服务器内存中。您应该在 IIS 上验证应用程序池回收时间。

干杯,

【讨论】:

  • 感谢您的努力,但应用程序池回收时间不是问题。
【解决方案4】:

你可以试试 SQL server 会话状态模式。

【讨论】:

  • 升级过程中发生了什么变化?
  • 你需要在服务器上启动状态服务器windows服务,还需要运行一些命令来安装在sql server中存储会话的数据库。欲了解更多信息,请访问codeproject.com/Articles/104082/… 在此会话状态模式下,您的会话将永不过期。
【解决方案5】:

一个可能相关的问题:IIS(以及 ASP.NET 开发服务器)在您从 TFS 签出文件后重新启动应用程序。

我在这里找到了解决方案:http://forums.iis.net/p/1200785/2055480.aspx/1?IIS+Express+restarts+site+when+a+file+is+checked+out

  1. 导航到:%USERPROFILE%\AppData\Roaming\Microsoft\VisualStudio\11.0
  2. 删除 app_offline.htm 文件。
  3. 创建一个名为 app_offline.htm 的文件夹

【讨论】:

    猜你喜欢
    • 2018-01-07
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多