将虚拟目录添加到“默认网站”后,IIS 7.5 AppDomain 回收导致会话丢失

将虚拟目录添加到“默认网站”后,IIS 7.5 AppDomain 回收导致会话丢失

我希望你能在这里帮助我,因为我已经尝试在另一个论坛上找到一些答案(看这里)这个问题是基于 Scott Forsyth 的回复这里

在 IIS 管理器中向“默认网站”添加新的虚拟目录时,默认网站中的所有其他应用程序都会以某种方式被回收。为了简化我的问题,我举了一个例子,其中我可以跟踪当前会话的时间戳,并意识到在添加 VD 后会话信息确实丢失了,这意味着 AppDomain 被回收了。

情况如下:

站点

Default Web Site

    1 (virtual directory) (d:\TestAppDomains\1\)

       - app1 (Application)           (using App Pool 1)

    2 (virtual directory) (d:\TestAppDomains\2\)

       - app2 (Application)           (using App Pool 2) 

据我所知,添加虚拟目录只是对 applicationHost.config 进行更改,这不会导致 AppDomains 回收。也许这是一个委托问题,但我想我还不够理解 :(

是否有任何属性会影响此行为?我已将 AppPool 设置设为在配置更改后不回收,但这没有帮助。

如果你能帮助我解决这个问题,我将非常感激,因为我已经为此奋斗了将近 6 个月。

当然,如果您需要的话,我很乐意提供更多信息。

更新 1:

HealthMonitoring 无法帮助我解决这个问题,原因有二:

  1. 找不到 AppPool 回收的任何条目,它应该在哪里?事件查看器 -> Windows 日志/应用程序和服务日志?(应正确配置)
  2. 也许我搞错了。一开始我以为这是一个应用程序池回收,但通过简化的测试,我构建了一个没有任何应用程序和额外应用程序池的示例。现在它看起来就像这样:

站点

Default Web Site

    1 (virtual directory) (d:\TestAppDomains\1\)          
           session1.aspx (Sets current timestamp to session variable and redirects to session2.aspx)
           session2.aspx (displays session variable)

通过调用 localhost/1/sessions1.aspx,我可以看到时间戳。添加第二个虚拟目录(例如“2”(d:\TestAppDomains\2))并刷新页面后,会话消失,这意味着变量为空。

干杯,亚当

答案1

我遇到了和你描述的一样的情况IIS 论坛:一个网站,多个应用程序池,多对应用程序(Web 服务)和虚拟目录(html + js),自动部署等等。

问题是相同的:当我添加/删除虚拟目录时,所有应用程序都会重新启动。这不好,因为我计划提供多个版本,并希望用户在部署新版本时工作。

我尝试过设置委派,但没有成功。然后我注意到添加/删除一个应用程序不会导致其他应用程序重新启动。

所以,这是解决方案:为网页创建单独的应用程序而不是虚拟目录

答案2

如果您有 ASP.NET应用程序域重新启动,原因在这里详细介绍:

https://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.asp

你有应用程序池回收事件日志记录是否已启用?这将是我首先要开始的地方:

在此处输入图片描述

如果您有 ASP.NET 应用程序,您还可以在 web.config 的 system.web 部分中启用 HealthMonitoring。这些日志记录选项可能有助于识别正在发生的事情。示例:

  <system.web>
    <healthMonitoring enabled="true" heartbeatInterval="1">    
      <rules>
        <add name="HeartBeat" 
             eventName="Heartbeats" 
             provider="EventLogProvider" 
             profile="Default" 
             minInstances="1"
             minInterval="00:01:00"
             maxLimit="Infinite"/>
        <add name="App Lifetime"
             eventName="Application Lifetime Events"
             provider="EventLogProvider"
             profile="Default"
             minInstances="1" 
             minInterval="00:00:00"
             maxLimit="Infinite"/>
      </rules>
    </healthMonitoring>

常见问题解答 - ASP.NET 2.0 中的健康监测
http://forums.asp.net/t/1027461.aspx/1

healthMonitoring 元素(ASP.NET 设置架构)
http://msdn.microsoft.com/en-us/library/2fwh2ss9%28v=vs.100%29.aspx

相关内容