当调用GetAuthorizationGroups() 的错误-“试图访问卸载的应用程序域“(Exception from HRESULT: 0x80131014)解决方案

针对 Windows 平台,Microsoft 提供了三个主要目录平台:Active Directory 域服务、每台 Windows 计算机上的本地安全帐户管理器 (SAM) 数据存储,以及比较新的 Active Directory 轻型目录服务或 AD LDS(即您先前已经知道的 Active Directory 应用程序模式或简称 ADAM)。这篇博文不是讲活动目录的使用,具体可以参照MSDN一篇文章专门介绍活动目录的编程http://msdn.microsoft.com/zh-cn/magazine/cc135979.aspx

本文主要是记录使用GetAuthorizationGroups()接口或用用户的时候经常抛出的一个错误:具体可以看Microsoft Connect http://connect.microsoft.com/VisualStudio/feedback/details/566463/attempted-to-access-an-unloaded-appdomain-exception-from-hresult-0x80131014-when-calling-getauthorizationgroups

微软并没有给出解决方案,在stackoverflow 上也有讨论到这个问题 http://stackoverflow.com/questions/5895128/attempted-to-access-an-unloaded-appdomain-when-using-system-directoryservices

在stackoverflow上的讨论中有了一种解决方案,再发生AppDomainUnloadedException 错误的时候,通过休眠一段时间重新调用这个接口:

private PrincipalSearchResult<Principal> GetAuthorizationGroups(UserPrincipal userPrincipal, int tries)
{
    try
    {
        return userPrincipal.GetAuthorizationGroups();
    }
    catch (FileNotFoundException ex)
    {
        if (tries > 5)
            throw; tries++;
        Thread.Sleep(1000);
        return GetAuthorizationGroups(userPrincipal, tries);
    }
    catch (AppDomainUnloadedException ex)
    {
        if (tries > 5)
            throw; tries++;
        Thread.Sleep(1000);
        return GetAuthorizationGroups(userPrincipal, tries);
    }
}
这样就会造成一个问题,如果发生了异常,接口就非常的慢了。这可以通过引入缓存机制来解决:
public override String[] GetRolesForUser(String username)
{
    // If SQL Caching is enabled, try to pull a cached value.
    if (_EnableSqlCache)
    {
        String CachedValue;
        CachedValue = GetCacheItem('U', username);
        if (CachedValue != "*NotCached")
        {
            return CachedValue.Split(',');
        }
    }
    ArrayList results = new ArrayList();
    using (PrincipalContext context = new PrincipalContext(ContextType.Domain, null, _DomainDN))
    {
        try
        {
            UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);
            var tries = 0;
            var groups = GetAuthorizationGroups(p, tries);
            foreach (GroupPrincipal group in groups)
            {
                if (!_GroupsToIgnore.Contains(group.SamAccountName))
                {
                    if (_IsAdditiveGroupMode)
                    {
                        if (_GroupsToUse.Contains(group.SamAccountName))
                        {
                            results.Add(group.SamAccountName);
                        }
                    }
                    else
                    {
                        results.Add(group.SamAccountName);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new ProviderException("Unable to query Active Directory.", ex);
        }
    }
    // If SQL Caching is enabled, send value to cache
    if (_EnableSqlCache)
    {
        SetCacheItem('U', username, ArrayListToCSString(results));
    }
    return results.ToArray(typeof(String)) as String[];
}

上面的代码来自于Active Directory Roles Provider。

本文来自合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

时间: 2024-10-23 21:35:24

当调用GetAuthorizationGroups() 的错误-“试图访问卸载的应用程序域“(Exception from HRESULT: 0x80131014)解决方案的相关文章

LoadUserProfile 调用因下列错误而宣告失败: 拒绝访问的常见解决方法_win服务器

看到LoadUserProfile这个,应当与用户有关.又是需要什么用户的权限呢? 就凭这些信息,也想不出是什么原因导致的,只能到网上找. 找了一下,原来是C:\Documents and Settings目录缺少 NETWORD SERVICE权限,说实话,要不是找,我想死了也想不出是这个权限问题. 我感觉系统出现错误时,应当把解决方法都显示出来才好呢,呵呵... C:\Documents and Settings加上NETWORD SERVICE权限后,问题解决. mysql以低权限运行出现

尝试访问已卸载的 AppDomain。 (异常来自 HRESULT:0x80131014)

问题描述 用了一个第三方的组件,vs里面可以运行,IIS下运行就报错了.[求解]说明:执行当前Web请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息.异常详细信息:System.AppDomainUnloadedException:尝试访问已卸载的AppDomain.(异常来自HRESULT:0x80131014)源错误:行24:content.Append(@"翻译说明:语音识别中重点翻译"命令识别"[Commandrec

上传-调用WEBservice 程序错误显示,目标机积极拒绝链接

问题描述 调用WEBservice 程序错误显示,目标机积极拒绝链接 公司让我把数据库的数据上传到外地客户端,以前的一个程序员写了一个上传程序,里面调用的web Service 程序,配置文件如下: <?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="WebServiceUrl" value=&quo

LoadUserProfile 调用因下列错误而宣告失败

  今天突然看到服务器出现这样的错误提示,拒绝访问,肯定是权限问题,是哪里的权限问题呢. 看到LoadUserProfile这个,应当与用户有关.又是需要什么用户的权限呢? 就凭这些信息,也想不出是什么原因导致的,只能到网上找. 找了一下,原来是C:Documents and Settings目录缺少 NETWORD SERVICE权限,说实话,要不是找,我想死了也想不出是这个权限问题. 我感觉系统出现错误时,应当把解决方法都显示出来才好呢,呵呵... C:Documents and Setti

java-RESTful API在代码中调用出现 505错误

问题描述 RESTful API在代码中调用出现 505错误 问题如下: 1.RESTful API在浏览器中访问,没有问题,返回结果正确. 2.在代码里调这个RESTful API就会报505错误. 调用的代码结构如下: 1.先鉴权,并保存cookie final String userPassword = bean.getUsername() + ":" + bean.getPassword(); final String encoding = new sun.misc.BASE6

ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法

原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法       群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebService方法,总报这个错误,贴图如下: 解决办法:      1.确定你的Silverlight项目及承载Silverlight的Web程序根目录下都包含2个跨域文件,分别是crossdomain.xml和clientaccesspolicy.xml:  crossdomain.xml文件,

win7系统电脑打开ug8.5提示“内部错误 内存访问违例”怎么办

  win7系统电脑打开ug8.5提示"内部错误 内存访问违例"怎么办?专业设计人员制作不同的图片需要不同的软件,比如三维建筑我们都用"Auto cad",平面设计大多用户都用"Photoshop"等等.但是最近有位win7纯净版系统用户使用Ug进行三维设计说,打开ug8.5提示"内部错误 内存访问违例"导致软件没办法使用,怎么办呢?经测试发现,这是由于UG程序中的"DialogMemory.dlx"出错导

axwebbrowser.hwnd返回&amp;amp;#x27;对 COM 组件的调用返回了错误 HRESULT E_FAIL&amp;amp;#x27;

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingmshtml;namespaceBHOBrowser{publicpartialclassForm1:Form{publicForm1(){In

class-eclipse已经倒导入jar包可是调用还是提示错误

问题描述 eclipse已经倒导入jar包可是调用还是提示错误 我已經导入jar包了,可是该如何import才能使用包里面的class呢? 解决方案 突然就搞好了 我把调用的方式从print(""..."")改为Print.print(""blabla"")就好了 谢谢大家帮助 解决方案二: 参考 eclipse中几种加入jar包方式的区别 解决方案三: 我是导入了一个print包,但是里面的方法没办法调用,print.jar