Связанное с Active Directory исключение AppDomainUnloadedException в MVC4
У меня есть приложение ASP.NET MVC. Он запускается на домене, и мы определяем пользователя по телефону UserPrincipal.Current
, Это работает прекрасно, большую часть времени. Время от времени (возможно, 1 из 5), и только сразу после публикации моего приложения в 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 на самом деле из исправления, и это (размер и версия # соответствия).
В то же время я получаю это исключение, я получаю это событие в журнале событий:
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, но я подумал, что мне нужно сделать попытку здесь в Stackru...