C# 检查Active Directory角色占用的时间太长

C# 检查Active Directory角色占用的时间太长,c#,active-directory,C#,Active Directory,我有这个代码来检查组成员资格,但它似乎花了太长的时间来响应和减缓我的应用程序,它需要近7-12秒来响应,我只需要检查一个特定的组成员资格,有没有更快的方法来做到这一点 public static bool isInRole(UserAccount userAccount, string groupName) { using (var ctx = new PrincipalContext(ContextType.Domain, userAccount

我有这个代码来检查组成员资格,但它似乎花了太长的时间来响应和减缓我的应用程序,它需要近7-12秒来响应,我只需要检查一个特定的组成员资格,有没有更快的方法来做到这一点

  public static bool isInRole(UserAccount userAccount, string groupName)
        {


            using (var ctx = new PrincipalContext(ContextType.Domain, userAccount.DomainName))
            {
                using (var grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName))
                {
                    bool isInRole = grp != null &&
                        grp
                        .GetMembers(true)
                        .Any(m => m.SamAccountName == userAccount.UserName);
                    return isInRole;
                }

            }

我不能给你一个答案,因为我们没有足够的信息来追踪你的问题

首先,尝试使用标准工具(在web服务器上运行)查询广告-这是否同样慢?如果是这样,则可能是网络/DC问题

假设只是您的实现很慢

您是否正在调用一个托管在?要测试这一点,请执行多个调用并比较延迟-如果第一个调用明显更长,请查看您的IIS设置0您可以在卸载应用程序池之前增加空闲时间,等等,以缓解此问题

如果您确定您的代码花费的时间太长,请使用,它将识别哪些函数/调用导致延迟-如果它在您的代码中,请对其进行优化,如果它在框架中,则您要么使用错误,要么发现框架有问题(不太可能)

如果您可以编辑您的问题以包含上述问题的答案,我们可能会进一步提供帮助

编辑:在回答有关WCF内缓存的问题时,有多种方法可以解决此问题-您可以替换服务类的持久性提供程序,使其成为单例-然后您可以使用专用变量/内存进行缓存。这要求类是线程安全的


备选方案包括:数据库、文件系统、应用程序范围内的内存缓存()

我手头没有你的特定广告来测试这一点,但这可能值得一试:与其为特定用户检查组成员(可能有数千名成员),为什么不检查用户的组成员资格,看看用户是否拥有正确的组

比如:

public static bool isInRole(UserAccount userAccount, string groupName)
{
   using (var ctx = new PrincipalContext(ContextType.Domain, userAccount.DomainName))
   using (var user = UserPrincipal.FindByIdentity(ctx, userAccount.UserName))
   {
      bool isInRole = user != null &&
                      user.GetAuthorizationGroups()
                      .Any(g => g.Name == groupName);
      return isInRole;
   }
}

也许这样会更快一些?

您能将响应缓存一段可接受的时间吗?我怎么做?我正在使用WCF服务.net 4.0该组是否有很多成员?如果是这样,您可以通过查找用户帐户的组是否包含您要查找的组来获得更快的响应,不是查找组的成员是否包含您要查找的帐户。@adrianbanks我怎么能这样做?我已经有一段时间没有使用VS了,但我自己做了这件事-userAccount对象是否有
Groups
property/
GetGroups()
函数?我使用了VS探查器,发现这个特定的部分花费的时间太长。具体是哪一行,循环、linq还是
GroupPrincipal.FindByIdentity(ctx,IdentityType.Name,groupName)
?还是三分之一?是否已启用.Net Framework调试(在“工具”“选项”“调试”下),这允许您单步进入框架本身-启用此功能,启用调试符号的自动下载,以便可以看到可读代码,而不是反汇编,然后重新配置。这应该向您具体显示哪些调用导致了问题-我怀疑它在网络代码中,但可能是任何东西(可能它试图缓存,但缓存超时,等等)中的缓存仅限于服务操作olnly@Natasha我可能误解了您的观点,但您可以在WCF服务中使用缓存框架来缓存响应,也可以在客户机中缓存WCF调用的结果,因此它应该可以在任意一端工作。这是一个WPF缓存示例,但可以应用于其他.Net框架-正如我所说,我可能误解了您的观点,在这种情况下,请澄清:)什么是grp,当我构建时我得到grp;t在电流中存在conetxt@marc_s-你介意看看这个吗。同样的道理真的很奇怪,我无法得到专家的眼睛: