我有一个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下调试,这意味着我必须在每次更改代码时发布它,这意味着我通常在一天中看到这个(周二下午和昨天是例外)
我觉得很奇怪,从挖掘来看,这个bug似乎经常与ASP.NET MVC相关联,但我不相信我已经看到它与WinForms或ASP.NET有关...我可以看看这有多重要,但也许那里有关系。
我怀疑这是一个MS错误。我无法想象UserPrincipal.Current应该导致AppDomainUnloadedException的任何合法条件,但我想我会在Stackoverflow上点击这里......