У меня проблема с использованием С# на .Net 4 в веб-приложении MVC, где, когда я запрашиваю Active Directory, я часто получаю сообщение об ошибке: Попытка получить доступ к незагруженному appdomain. (Исключение из HRESULT: 0x80131014).
Странная вещь, что она будет работать безупречно какое-то время, а затем она только начнет происходить, а затем просто исчезнет снова.
Я сделал несколько изменений в функции, чтобы заставить ее работать, но все они, похоже, терпят неудачу. Мне интересно, если я что-то делаю неправильно, или если есть лучший способ сделать это.
Вот моя текущая функция, которая будет принимать loginId и PrincipalContext. LoginId может быть либо пользователем DisplayName i.e "John Smith", либо DOMAINNAME\josmi. По умолчанию используются первые 2 буквы их первого имени, а затем первые 3 буквы их фамилии. Там есть чек, если это не так. Эта часть, если она прекрасна.
public List<ADGroup> GetMemberGroups(string loginId, PrincipalContext principalContext, int tries = 0)
{
var result = new List<ADGroup>();
try
{
var samAccountName = "";
if (loginId.Contains(" "))
{
var fName = loginId.Split(Char.Parse(" "))[0].ToLower();
var sName = loginId.Split(Char.Parse(" "))[1].ToLower();
if (sName.Trim().Length == 2)
samAccountName = string.Format("{0}{1}", fName.StartsWith(".") ? fName.Substring(0, 4) : fName.Substring(0, 3), sName.Substring(0, 2));
else
samAccountName = string.Format("{0}{1}", fName.StartsWith(".") ? fName.Substring(0, 3) : fName.Substring(0, 2), sName.Substring(0, 3));
}
else
samAccountName = loginId.Substring(loginId.IndexOf(@"\") + 1);
var authPrincipal = UserPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, samAccountName);
if (authPrincipal == null)
throw new Exception(string.Format("authPrincipal is null for loginId - {0}", loginId));
var firstLevelGroups = authPrincipal.GetGroups();
AddGroups(firstLevelGroups, ref result);
}
catch
{
if (tries > 5)
throw;
tries += 1;
System.Threading.Thread.Sleep(1000);
GetMemberGroups(loginId, principalContext, tries);
}
return result;
}
private void AddGroups(PrincipalSearchResult<Principal> principal, ref List<ADGroup> returnList)
{
foreach (var item in principal)
{
if (item.GetGroups().Count() > 0)
AddGroups(item.GetGroups(), ref returnList);
returnList.Add(new ADGroup(item.SamAccountName, item.Sid.Value));
}
}
Эта функция вызывается следующим образом:
MembershipGroups = ad.GetMemberGroups(user.SamAccountName, new PrincipalContext(ContextType.Domain));
Ошибка, которую я получаю:
System.AppDomainUnloadedException: Попытка получить доступ к разгруженной AppDomain. (Исключение из HRESULT: 0x80131014) в System.StubHelpers.StubHelpers.InternalGetCOMHRExceptionObject(Int32 hr, intPtr pCPCMD, объект pThis) при System.StubHelpers.StubHelpers.GetCOMHRExceptionObject(Int32 hr, intPtr pCPCMD, объект pThis) при System.DirectoryServices.AccountManagement.UnsafeNativeMethods.IADsPathname.Retrieve(Int32 lnFormatType) в System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDomainInfo() в System.DirectoryServices.AccountManagement.ADStoreCtx.get_UserSuppliedServerName() в System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.BuildPathFromDN(String dn) при System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNextPrimaryGroupDN() в System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNext() в System.DirectoryServices.AccountManagement.FindResultEnumerator
1.MoveNext() at System.DirectoryServices.AccountManagement.FindResultEnumerator
1.System.Collections.IEnumerator.MoveNext()