我有这个代码来检查群组成员资格,但似乎需要花费太长时间来响应和减慢我的应用程序,它需要几乎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;
}
}
答案 0 :(得分:1)
我无法给你答案,因为我们没有足够的信息,只能追查你的问题......
首先,尝试使用标准工具(在Web服务器上运行)查询AD - 这是否同样慢?如果是这样,那可能是网络/ DC问题。
假设这只是你的实施很慢......
您是否正在调用taking time to compile/load网站中托管的WCF服务?要对此进行测试,请执行多次调用并比较延迟 - 如果第一次调用显着更长,请查看您的IIS设置0您可以在应用程序池卸载之前增加空闲时间等,以缓解此问题。
如果您确定代码花费的时间过长,请使用Visual Studio Pofiler来识别导致延迟的函数/调用 - 如果它在您的代码中,请优化它,如果它在框架中那么你要么使用它错了,要么你发现框架有问题(不太可能)。
如果您可以修改问题以包含上述答案,我们可能会提供进一步的帮助
编辑:为了回应有关WCF内缓存的问题,有很多方法可以解决这个问题 - 您可以将服务类的持久性提供程序替换为单例 - 然后就可以了只需使用私有变量/内存进行缓存。这要求您的类是线程安全的。
替代方案包括:数据库,文件系统,应用程序范围的内存缓存(System.Runtime.Caching)
答案 1 :(得分:0)
我没有你手头的特定AD来测试这个 - 但是值得尝试:不是为特定用户检查群组成员(可能有成千上万的成员),为什么不呢?检查用户的组成员身份以查看用户是否具有正确的组??
类似的东西:
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;
}
}
也许这样的事情会更快一些?