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 应用程序项目模板重现该问题,删除了不必要的内容并且无法重现此问题。

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

我还将真实项目中的 web.config 剥离到最低限度,使其看起来像新项目中的那样,但这也不允许我删除错误。我在 web.config 中注释掉的东西是 DevExpress Controls、自定义健康监控、IIS UrlRewrite 2

Applicationpool as Integrated,v4.0 与 NetworkService 作为身份

4

5 回答 5

8

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

在 web.config 中添加这个键:

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

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

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

于 2012-12-06T10:04:39.730 回答
3

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

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

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

为什么会这样

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

新版本中也有不少改变来优化网络服务器。您可以在此处查看这些更改的详细信息,它们还可以在您升级时解释更改。 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。

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

于 2012-11-05T10:17:07.320 回答
0

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

干杯,

于 2012-10-30T16:06:43.053 回答
0

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

于 2012-11-04T14:34:07.893 回答
0

一个可能相关的问题: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 的文件夹
于 2013-09-02T12:11:02.387 回答