我有一个 ASP.NET MVC 应用程序。它在域上运行,我们通过调用来确定用户UserPrincipal.Current
。这在大多数情况下都很有效。每隔一段时间(可能 5 次中就有 1 次),并且只有在我将应用程序发布到 IIS 之后,它才会抛出 AppDomainUnloadedException。
导致异常的代码的特定行是:
if (UserPrincipal.Current.SamAccountName != null &&
_currentUserId != UserPrincipal.Current.SamAccountName) ...
调用堆栈的其余部分是:
mscorlib.dll!System.StubHelpers.StubHelpers.GetCOMHRExceptionObject(int hr, System.IntPtr pCPCMD, object pThis) + 0xe bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDomainInfo() + 0x358 bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.ADStoreCtx.DnsDomainName.get() + 0x5e bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.ADStoreCtx.GetAsPrincipal(object storeObject, object discriminant = {Name = "UserPrincipal" FullName = "System.DirectoryServices.AccountManagement.UserPrincipal"}) + 0x17a bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.ADStoreCtx.FindPrincipalByIdentRefHelper(System.Type principalType, string urnScheme, string urnValue, System.DateTime referenceDate, bool useSidHistory) + 0x576 bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.ADStoreCtx.FindPrincipalByIdentRef(System.Type principalType, string urnScheme, string urnValue, System.DateTime referenceDate) + 0x35 bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(System.DirectoryServices.AccountManagement.PrincipalContext context, System.Type principalType, System.DirectoryServices.AccountManagement.IdentityType? identityType, string identityValue, System.DateTime refDate) + 0x9e bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(System.DirectoryServices.AccountManagement.PrincipalContext context, System.Type principalType, System.DirectoryServices.AccountManagement.IdentityType identityType, string identityValue) + 0x5b bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(System.DirectoryServices.AccountManagement.PrincipalContext context, System.DirectoryServices.AccountManagement.IdentityType identityType, string identityValue) + 0x1e bytes
System.DirectoryServices.AccountManagement.dll!System.DirectoryServices.AccountManagement.UserPrincipal.Current.get() + 0xc1 bytes
经过大量挖掘,由于异常的随机性,我得出结论,问题可能与此有关:
http://support.microsoft.com/kb/2683913
所以我安装了修补程序,正如预期的那样,问题消失了。那是星期二。今天早上,异常又开始了。我验证了 hotifx 确实已安装。我打开了模块加载消息并得到:
'w3wp.exe': Loaded 'C:\Windows\SysWOW64\activeds.dll', Cannot find or open the PDB file.
所以我验证了那个 .dll 实际上是来自修补程序的那个,它是(大小和版本#s 匹配)。
在我得到这个异常的同时,我在事件日志中得到这个事件:
A process serving application pool 'WebSitePool' suffered a fatal communication error with the Windows Process Activation Service. The process id was '7404'. The data field contains the error number.
错误中的唯一数据是:0x8007006D,我相信这只是意味着存在致命的通信错误,错误已经说过......
幽默的是,当异常对话框弹出时,它说:“如果有这个异常的处理程序,程序可以安全地继续。” 如果您的应用程序不需要 UserPrincipal.Current,这是正确的,但是在此异常之后再次调用它会导致异常重新抛出,所以我会质疑他们在那里的“安全继续”断言。
现在,如果我重新运行该应用程序,我不会遇到问题。除了发布后,我还没有任何时候发生过这种情况。由于我们的设置和与其他项目的关系,这个应用程序必须在 IIS 下调试,这意味着我每次进行代码更改时都必须发布它,这意味着我通常一整天都看到这个(周二下午和昨天除外) .
我似乎很好奇,从四处挖掘,这个错误似乎经常与 ASP.NET MVC 相关联,但我不相信我已经看到它与 WinForms 或 ASP.NET 相关联......我看不到这有什么关系,但也许那里有关系。
我怀疑这是一个 MS 错误。我无法想象在任何合法条件下 UserPrincipal.Current 会导致 AppDomainUnloadedException,但我想我会在 Stackoverflow 上试一试……