1

我有一个 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 上试一试……

4

0 回答 0