Использование идентификатора пула приложений приводит к исключениям и журналам событий
Недавно я переключил свои приложения с использования олицетворения ASP.NET на фактическое указание удостоверения в пуле приложений. Причиной этого было использование в будущем async
проще так темы запускаются как моя служебная учетная запись.
После внесения изменений на сайте возникли некоторые проблемы. В день внесения изменений я вижу, что эти журналы событий появляются гораздо чаще (раньше это было 2-3 раза в день, теперь это 8-10 раз в день):
Windows detected your registry file is still in use by other applications or services. The file will be unloaded now. The applications or services that hold your registry file may not function properly afterwards.
DETAIL -
3 user registry handles leaked from \Registry\User\S-1-5-21-1695807550-3099950144-3292890465-4346:
Process 3840 (\Device\HarddiskVolume2\Windows\System32\inetsrv\w3wp.exe) has opened key \REGISTRY\USER\S-1-5-21-1695807550-3099950144-3292890465-4346
Process 3840 (\Device\HarddiskVolume2\Windows\System32\inetsrv\w3wp.exe) has opened key \REGISTRY\USER\S-1-5-21-1695807550-3099950144-3292890465-4346\Control Panel\International
Process 3840 (\Device\HarddiskVolume2\Windows\System32\inetsrv\w3wp.exe) has opened key \REGISTRY\USER\S-1-5-21-1695807550-3099950144-3292890465-4346\Software\Microsoft\Windows\CurrentVersion\Explorer
Я также получаю (на первый взгляд) ошибку при обращении к активной директории:
System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000)
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue)
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
Последняя ошибка, которую я вижу после внесения изменений (хотя, похоже, это происходит реже):
System.Runtime.InteropServices.COMException (0x800703FA): Illegal operation attempted on a registry key that has been marked for deletion.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue)
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
После сброса пула приложений проблема исчезает. К сожалению, кажется, что он возвращается через день или два.
У кого-нибудь есть представление о том, что здесь происходит? Я мог бы вернуться к использованию олицетворения, так как это никогда не происходило до тех пор, пока я не переключил удостоверение пула приложений на конкретного пользователя. Мой Google-фу не дал мне никаких ответов сегодня.
2 ответа
Я не смог найти причину проблемы. Однако кажется, что использование одного и того же идентификатора для нескольких пулов приложений может вызвать некоторые проблемы, если базовый код использует ресурсы, принадлежащие этому идентификатору.
Изменение настроек пула приложений Load User Profile
в True
Исправлена ошибка, при которой записи в журнале событий прекращались.
Я собираюсь сделать попытку и сказать, что вы, вероятно, не очищаете ресурсы должным образом. Microsoft.Win32.RegistryKey
объекты и System.DirectoryServices.AccountManagement.PrincipalContext
оба IDisposable
и должны быть утилизированы, когда они больше не используются.
Возможно, эти ресурсы могли быть очищены, когда время сеансов пользователей истекло до изменения, и их больше нет, так как вы отключили олицетворение.