【问题标题】:MemberOf Expand not Populating CollectionMemberOf 展开未填充集合
【发布时间】:2017-03-09 09:56:20
【问题描述】:
var client = ActiveDirectoryClientFactory.GetActiveDirectoryClient(_connector);
client.Context.MergeOption = MergeOption.AppendOnly;
_withOwnedDevices = await client.Users.Expand(d => d.OwnedDevices).ExecuteAsync();
_withMemberOf = await client.Users.Expand(d => d.MemberOf).ExecuteAsync();

运行上述代码时,我确实得到了 OwnedDevices,但 MemberOf 总是返回空。

var client = ActiveDirectoryClientFactory.GetActiveDirectoryClient(_connector);
_withOwners = await client.Devices.Expand(d => d.RegisteredOwners).ExecuteAsync();
_withUsers = await client.Devices.Expand(d => d.RegisteredUsers).ExecuteAsync();
_withMemberOf = await client.Devices.Expand(d => d.MemberOf).ExecuteAsync();

类似地运行上述网络 RegisteredOwners 和 RegisteredUsers 但在 MemberOf 集合上没有任何内容。

var client = ActiveDirectoryClientFactory.GetActiveDirectoryClient(_connector);
var matches = await client.Users.Where(u => u.Mail == email).Expand(u => u.MemberOf).ExecuteAsync();

这会得到一个匹配列表,一个,并且 MemberOf 集合有结果。在所有情况下都查询同一个 Active Directory。

问题似乎与需要特殊的 MergeOption 有关。如果没有 AppendOnly 或 NoTracking,当使用不同的展开选项进行两次调用中的第二次时,我会遇到异常。我对设备做了类似的事情,根本不需要设置 MergeOption 并且上下文合并对象没有问题,因此两个扩展集合都显示在实体上。对于用户,如果您尝试相同的操作,ActiveDirectoryClient 会抛出“上下文已经在跟踪具有相同资源 Uri 的不同实体。”在使用设备进行测试时,该问题仅在尝试对 MemberOf 进行扩展时才会出现,可以进行多次调用以扩展其他集合,但是一旦我尝试使用 MemberOf,您就会得到跟踪异常。

【问题讨论】:

    标签: c# azure-active-directory


    【解决方案1】:

    我测试了以下代码:

                ActiveDirectoryClient client = AuthenticationHelper.GetActiveDirectoryClient();
    
                client.Context.MergeOption = MergeOption.AppendOnly;
                var _withMemberOf = await client.Users.Expand(d => d.MemberOf).ExecuteAsync();
    

    以上代码将返回用户的页面集合。当前页面的最大用户数为 100。每个用户都有一个 MemberOf 属性,该属性显示用户的组和角色成员资格。Blow 是在 vs 中调试时的屏幕截图:

    请检查您是否成功通过以下方式获取 MemberOf 集合的用户:

    var client = ActiveDirectoryClientFactory.GetActiveDirectoryClient(_connector);
    var matches = await client.Users.Where(u => u.Mail == email).Expand(u => u.MemberOf).ExecuteAsync();
    

    包含在 CurrentPage 集合中,您可以使用下面的代码来获取用户的下一页集合以检查:

                client.Context.MergeOption = MergeOption.AppendOnly;
                IPagedCollection<IUser> pagedCollection = await client.Users.Expand(d => d.MemberOf).ExecuteAsync();
                if (pagedCollection != null)
                {
                    do
                    {
    
                        //loop the users and get the memberof information
    
                        pagedCollection = await pagedCollection.GetNextPageAsync();
                    } while (pagedCollection != null);
    
                }
    

    【讨论】:

    • 当我直接在 IUserCollection 上使用扩展时,就像在第一个代码中一样,MemberOf 集合为空。当我在 IReadOnlyQueryableSet 上使用扩展时,由于位置的原因,在第二个代码中我得到了一个填充的 MemberOf 集合。我在获取页面时没有问题,在尝试获取用户列表时 MemberOf 集合的不一致行为伤害了我。
    • @Montane Hamilton,使用第一个代码时,MemberOf 集合为空是什么意思。我在我的答案中添加了一个截图,你会发现它有结果,请检查。
    • 做你正在做的事情,但调用获取用户并展开 OwnedDevices,然后在 memberOf 上展开相同的调用。没有错误,但 MemberOf 集合将为空。如果我只调用用户并展开 MemberOf,我会填充集合。第三次进行多次调用测试,但删除了合并选项的设置,由于上下文对某些对象的处理不当,并且正在跟踪具有相同 URI 的多个实体,因此一切都发生了异常。
    • @Montane Hamilton ,发生此异常的原因是您的反序列化类型与跟踪实体的类型不完全匹配。为避免这种情况,您可以不使用跟踪选项(client.Context.MergeOption = MergeOption.NoTracking;)或为每个逻辑操作使用新的 ActiveDirectoryClient。
    • 对,我可以做到这一点,但是让一个填充了多个集合的实体不再起作用。如果我通过跟踪其他类型来做到这一点,它将毫无问题地合并实体。使用 MemberOf 集合,碰撞发生在不应该发生的时候。如果我可以扩展多个集合,那么我可以在一个调用中完成它,但必须在两个单独的调用中完成它适用于某些实体,而不适用于其他实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2011-11-07
    • 2011-07-23
    • 2019-06-16
    • 2019-06-16
    • 2011-12-01
    相关资源
    最近更新 更多