当前位置: 首页 > news >正文

当调用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。

相关文章:

  • Windows XP 性能优化VDI
  • 理解IP前缀列表(转载)
  • Linq to SQL 多条件动态组合查询(实战篇)
  • KMaster知识管理平台功能简介
  • MVA虚拟化学院的奖品
  • 在RHEL5下构建Cacti监测系统
  • ASP.NET编程中的十大技巧
  • php数组相关总结
  • OAF—如何发布你的个性化文件
  • 51.com数十高层离职幕后:3年内乱因扩张失败,互联网营销
  • Eclipse RCP实现自定义闪屏
  • 二维平面的凸包构建
  • winform datagridview 定制用户数据
  • IE8“开发人员工具”使用详解
  • LINQ - 查询[LINQ学习-1]
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • codis proxy处理流程
  • CSS居中完全指南——构建CSS居中决策树
  • JS基础之数据类型、对象、原型、原型链、继承
  • LeetCode算法系列_0891_子序列宽度之和
  • log4j2输出到kafka
  • Spring Boot快速入门(一):Hello Spring Boot
  • vuex 学习笔记 01
  • Zepto.js源码学习之二
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从零开始的无人驾驶 1
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 坑!为什么View.startAnimation不起作用?
  • 前端工程化(Gulp、Webpack)-webpack
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 转载:[译] 内容加速黑科技趣谈
  • Nginx实现动静分离
  • 通过调用文摘列表API获取文摘
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Python 3 新特性:类型注解
  • #14vue3生成表单并跳转到外部地址的方式
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (12)Hive调优——count distinct去重优化
  • (27)4.8 习题课
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (31)对象的克隆
  • (6)添加vue-cookie
  • (a /b)*c的值
  • (day6) 319. 灯泡开关
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计大学生兼职系统
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)jQuery 基础
  • (转)ObjectiveC 深浅拷贝学习
  • (转)用.Net的File控件上传文件的解决方案