FindByIdentity - 性能差异

时间:2011-09-23 19:21:31

标签: .net iis-7 directoryservices

以下代码可以在我们域中的各种计算机上正常运行。

var context = new PrincipalContext(ContextType.Domain);
var principal = UserPrincipal.FindByIdentity(context, @"domain\username")

但是,如果我在不在域上的计算机上运行此类似的代码,它可以工作,但FindByIdentity行需要2秒以上。

var context = new PrincipalContext(ContextType.Machine);
var principal = UserPrincipal.FindByIdentity(context, @"machinename\username")

通过向PrincipalContext构造函数和/或FindByIdentity方法提供特殊参数,可以解决这种性能差异吗? IIS或Windows中是否有可以调整的设置?

至少,有人可以告诉我为什么在第二种情况下它可能会变慢吗?

代码是在Windows Server 2008 R2上的IIS 7.5(集成管道)中托管的ASP.NET MVC 3应用程序中运行的。

2 个答案:

答案 0 :(得分:22)

我遇到了同样的问题。试试下面的代码块。我不知道为什么但速度要快得多(在VS中构建后忽略第一次缓慢登录 - 后续登录速度很快)。请参阅类似的问题Why would using PrincipalSearcher be faster than FindByIdentity()?

var context = new PrincipalContext( ContextType.Machine );
var user = new UserPrincipal(context);
user.SamAccountName = username;
var searcher = new PrincipalSearcher(user);
user = searcher.FindOne() as UserPrincipal;

潜在问题可能与netBios调用有关。见ADLDS very slow (roundtrip to \Server*\MAILSLOT\NET\NETLOGON)

答案 1 :(得分:0)

即使JimSTAT的回答太老了,它也使我朝着解决我的问题的正确方向前进。 我想指出的是,在所有Hyper-V-Switch网络接口上禁用NetBIOS over TCP/IP可以消除我之前遇到的所有延迟。对PrincipalContext()UserPrincipal.FindByIdentity()UserPrincipal.GetGroups()的每次调用都从10,000毫秒以上降低到10毫秒或更短。在我看来,正在查询每个虚拟网卡,这花费了一个多世纪的时间。幸运的是,我找到了此帖!