【发布时间】:2014-04-11 13:15:50
【问题描述】:
我在一个应用程序中遇到了一个错误,该错误每月发生几次,但本周又发生了两次。发生这种情况时,总是在早上第一个用户加载应用程序并开始工作(Web 应用程序,3-4 个内部用户)的第一件事。错误源于这个非常简单的方法,一旦失败,直到我重新启动应用程序池。现在,我也在以其他方式查询 AD,但这是用户早上开始工作时调用的第一个 AD 相关方法。
public DomainUser GetDomainUser(string userLoginName)
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, this.DomainName))
{
using (UserPrincipal user = UserPrincipal.FindByIdentity(context, userLoginName))
{
// If user is null, the result is not a UserPrinciple
if (user != null)
{
string firstName = user.GivenName;
string middleName = user.MiddleName;
string lastName = user.Surname;
int empId = Convert.ToInt32(user.EmployeeId);
string emailAddr = user.EmailAddress;
string userName = user.SamAccountName;
DateTime? accountExp = user.AccountExpirationDate;
return new DomainUser
{
FirstName = firstName,
MiddleName = middleName,
LastName = lastName,
EmployeeId = empId,
Email = emailAddr,
UserName = userName,
AccountExpiration = accountExp
};
}
return null;
}
}
}
所以this 问题密切相关,但我的权限设置正确,代码 99% 的时间都可以运行,并且在应用程序池重新启动后将继续运行。
堆栈跟踪看起来像这样:
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, String identityValue)
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue)
at ADWrapper.AdSearch.GetDomainUser(String userLoginName)
可能是什么问题?内存泄漏?常见的模式是,当第一个用户开始使用应用程序时,这会发生在早上的第一件事。
【问题讨论】:
-
如果我是你,我会在 finally 子句中处理对象,以确保 ^^ 因为可能会发生错误,并生成未处理的对象。遇到此错误时,您是否也尝试使用 Thread.Sleep ? AD 可能会在响应和产生问题之前使用毫秒。
-
即使发生异常,using语句不应该处理这个吗?
-
取决于对象:stackoverflow.com/questions/149609/c-sharp-using-syntax。此外,在您的情况下,您应该与其他人分开管理 COMException 。我的意见;)
-
感谢您的评论。单独管理 COMException 是什么意思?在这种情况下,我相信除非发生电源故障之类的事情(此时,我不在乎),否则可以保证处置。
-
@Rafi 不,我从未找到真正的解决方案,但我相信这是由于内存泄漏造成的。我想不出任何其他可以解释错误的时间和随机性的东西。每当大量使用这些方法时,这个问题就会很痛苦。对我来说,这大约是一个月两次。因为这是一个小的内部应用程序,我只是重新启动应用程序池。我可能会避免 System.DirectoryServices.AccountManagment 大量使用,并采用手动创建 ldap 搜索查询的旧方法,如下所示:stackoverflow.com/a/1884855/1368050
标签: asp.net active-directory directoryservices account-management