ASP.Net在VS2012中,当标记更改时Inproc会话重启

16

我将我的开发机升级到了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 Application项目模板复现这个问题,删除了不必要的内容,但无法复制此问题。

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

我还将我的真实项目中的web.config简化到最低限度,看起来像新项目中的那个,但这并没有让我解决这个问题。我在web.config中注释掉的内容包括DevExpress Controls、自定义healthMonitoring、IIS UrlRewrite 2。

应用程序池为Integrated,v4.0,Identity为NetworkService。


http://forums.asp.net/p/1457959/3344056.aspx 和 http://forums.asp.net/t/1821704.aspx/1?Asp+net+Session+Problem - m.qayyum
请提供一个能够重现此问题的小代码,并将其发送到"netfx45compat(at)Microsoft(dot)com"邮箱中,可以吗? - Anand
请问您能否检查一下这是否与连接错误的问题相同?http://connect.microsoft.com/VisualStudio/feedback/details/766223/application-start-firing-multiple-times-when-saving-ascx-in-visual-studio-2012 - Anand
我明白了。因此,删除这些“DevExpress控件、自定义healthMonitoring、IIS UrlRewrite 2”中的任何一个都可以解决问题吗?您能否通过注释/取消注释其中一个控件来确定是哪个控件引起了问题?这将有助于我们隔离问题并可能找出根本原因。 - Anand
3
你能否在web.config文件中添加这个应用程序设置,并尝试该场景,看看问题是否会再现?<appSettings> <add key ="PageInspector:ServerCodeMappingSupport" value="Disabled"></add> </appSettings> - Anand
显示剩余8条评论
5个回答

8

我不想为此负责,但是答案在原问题的第11条评论中被@Anand提到:

在web.config文件中添加此键:

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

问题就这样解决了。Visual Studio 的响应速度也得到了很大的提升。唯一的缺点是你会失去页面检查器中的服务器端技巧。

希望微软能尽快提供一个修复方案。


添加这个键实际上修复了问题。我也希望微软很快修复这个解决方法,让其他遇到同样问题的开发者可以从 Anand 的答案中受益。 - citronas
3
是的,我们正在积极努力解决这个问题,确保能够彻底修复。该问题将在未来的VS 2012更新版本中得到修复。 - Anand
@Terry,页面检查器不应干扰.NET 3.5项目。 这是页面检查器的先决条件[链接](https://msdn.microsoft.com/query/dev11.query?appId = Dev11IDEF1&l = EN-US&k = k%28web.pageinspector%29; k%28VS.SolutionExplorer.Selection%29; k%28VS.SolutionExplorer%29; k%28VS.SolutionExplorer.Solutions%29; k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29&rd = true)。 你可以检查一下你的web.config文件并查看目标框架吗?我们已在最近的vs2013更新中修复了此问题。可能有其他管道中的组件导致会话重新启动。 - Anand
@Anand,我在web.config文件中找什么?我找不到“target”或“framework”。在网站属性下,它说目标框架:3.5。我检查了另一个经历同样流程(转换)的项目...我能够修改标记而不会终止会话。提前致谢。 - Terry
@Terry,你提到的问题与页面检查器无关。 - Anand
显示剩余3条评论

3
问题在于您的应用正在进行动态编译,这意味着对标记文件的任何更改都会导致应用程序重新启动。如您所知,任何应用程序重新启动都将清除InProc会话。
本地模板上的“Web应用程序”设置不同,因此它不会重新启动整个应用程序。然而,预编译也有其优点。
有几种方法可以解决这个问题。 为什么会发生这种情况 ASP.NET 4.5默认允许您同时运行“Web页面”和“Web应用程序”。这可能是导致对aspx进行更改触发预编译(每次更改时,“Web页面”都必须执行此操作)的原因。 更多信息请参见: 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服务器。
注意:您必须记住,如果您将类序列化到会话状态中并进行更改,则需要手动重新启动状态服务器,否则您将收到序列化错误。这很罕见,但在生产环境中要注意。

感谢指出编译模式的问题。显然,“从不”不起作用。我尝试了“自动”,可以让我在更改后运行2-3个请求,但是应用程序会在没有错误(Server.GetLastError()为空)的情况下结束,并且Application_Error没有触发。将CompilationMode设置为默认值以外的值(在4.0和4.5之间没有更改)对我没有任何好处。令人沮丧的是,我真的很想知道在升级过程中导致破坏性变化的原因。 - citronas
看看为什么会发生这种情况。我有90%的把握,这就是升级到4.5版本时出现行为变化的原因。以前在网页和Web应用程序之间只能选择其中一个。 - Gats

0

0

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

祝好!


感谢您的努力,但应用程序池回收时间不是问题。 - citronas

0

你可以尝试使用SQL Server会话状态模式。


升级过程中发生了什么变化? - citronas
你需要在服务器上启动状态服务器Windows服务,并运行一些命令来安装将会在SQL Server中存储会话的数据库。欲了解更多信息,请访问http://www.codeproject.com/Articles/104082/Configuring-ASP-session-state-on-SQL-server。在此会话状态模式下,您的会话将永不过期。 - Hiren Dhaduk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接