IIS 7.5 托管的应用程序在 AppPoolIdentity 上运行一段时间后失败

IIS 7.5 托管的应用程序在 AppPoolIdentity 上运行一段时间后失败

我在 Windows Server 2008 配置中遇到了 IIS 7.5 问题。我在单独的应用程序池中托管了一个 ASP.NET MVC 应用程序,使用 AppPoolIdentity 配置和.NET 4.0 Framework。

应用程序正常运行了一段时间(几分钟),之后我突然遇到似乎与 IIS 资源管理相关的异常。当我将 AppPoolIdentity 更改为“真实”本地系统用户时,问题消失凭据(本地管理员)。也许应用程序池回收在这里会造成问题?但它配置为每 1740 分钟回收一次,有时在启动 5 分钟后就会失败……

我希望能够在没有特殊要求和权限的情况下运行该应用程序,因为该应用程序非常简单,实际上不需要它。如果需要,我可以提供更多详细信息。但我必须让你知道,我没有使用 IIS 的实际经验。

从应用角度看问题细节

应用程序正常运行了一段时间,突然部分控制器开始在 StructureMap 内部抛出异常:

ArgumentNullException:尝试查找类型 [ MyType] 的实例参数名称:instance

StructureMap.InstanceCache.Get(Type pluginType, Instance instance) +376

请求的类型已正确注册(并在异常发生前一分钟正确解析)。我无法验证它是否仍已注册,因为WhatDoIHave诊断方法也会引发异常:

NullReferenceException:未将对象引用设置为对象的实例。在 StructureMap.Diagnostics.WhatDoIHaveWriter.writeInstance(InstanceRef instance) +133

看起来 StructureMap 的内部缓存不知为何被损坏了。

答案1

在 IIS 中,应用程序在应用程序池中运行。应用程序池在一个或多个 W3WP 进程中运行。

听起来这里发生的事情是,您的应用程序最终遇到了 W3WP 在以最小权限运行时无法应对的情况。

LocalSystem 是一个高权限帐户 - 当系统开始(或者在你的情况下,保持)以 LocalSystem 身份运行时,通常这表明某种形式的特权级别差异(有时是用户配置文件差异)。

默认情况下,所有应用程序池标识都会被神奇地授予 IIS_IUSRS 成员资格,从而授予 IIS 运行应用程序池所需的所有权限 - 这可能不包括特定应用程序/框架/其中一个库所需的所有权限。

尝试在运行低权限时在应用程序池中启用“加载用户配置文件”设置,如果这不能改善情况,则需要对其进行调试 - 使用进程监视器观察其运行情况以查找可能的文件或注册表访问困难(http://live.sysinternals.com/procmon.exe),或者在进程失败时抓取进程的内存转储,抓取 PSSCOR2,如果此时看起来没有什么特别奇怪的话,也许可以从 !dae 开始。

简而言之,内部进程/运行时状态听起来像是被吃掉了;但其实不然;通常这是某种本机代码问题,但在您的情况下,可能是权限问题。

编辑:哦,不是 LocalSystem,{本地系统用户就像管理员一样。明白了。好吧,试试个人资料 - 另请参阅这一点

另外,回收:当启动新的 W3WP 来替换旧的 W3WP 时,旧 W3WP 的所有状态都会丢失,如果旧的 W3WP 没有完成它仍然能够完成的任何有用的工作,那么它会在 90 秒后被杀死,然后自行关闭。(阅读“默认”)

相关内容