Насколько я должен кэшировать результаты запросов System.DirectoryServices.AccountManagement?

Я использую этот метод для возврата всех групп (рекурсивно), членом которых является пользователь, чтобы я мог выполнить некоторую авторизацию на уровне приложения.

Я вызываю это довольно часто (скажем, раз в 10-20 секунд, пока пользователь активен) из процесса службы, и я могу кэшировать результаты в (скажем) System.Runtime.Caching.MemoryCache.... однако это кажется, что результаты GetAuthorizationGroups уже кэшируются (т.е. список не обновляется, пока я не перезапущу службу)

Кто-нибудь знает, сколько оптимизации Microsoft уже вложила в структуру для такого рода запросов? т.е. Я не хочу преждевременно оптимизировать кэширование без необходимости.

    public static string[] GetActiveDirectoryGroups(string userName)
    {
        using (var context = new PrincipalContext(ContextType.Domain, "mydomain"))
        {
            using (var user = UserPrincipal.FindByIdentity(context, IdentityType.UserPrincipalName, userName))
            {
                return user != null ? 
                    user.GetAuthorizationGroups()
                        .Select(group => group.SamAccountName)
                        .ToArray()
                    : new string[] {};
            }
        }
    }

person Kram    schedule 14.07.2015    source источник


Ответы (1)


Мне неизвестно о каком-либо встроенном кэшировании в System.DirectoryServices.ActiveDirectory без явной настройки, например с помощью DirectorySearcher: https://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.cacheresults(v=vs.110).aspx

Если вы не выполняете какое-либо кэширование, .NET не будет выполнять кэширование автоматически. Он будет запрашивать Active Directory каждый раз, когда вы запускаете свою функцию. Похоже, вы случайно сохраняете результаты своего запроса Active Directory и не видите обновлений, как вы могли бы ожидать.

В качестве альтернативы вы вносите изменения, а затем запрашиваете контроллер домена, на который еще не выполнялась репликация. Когда вы перезапускаете службу, ваше приложение обращается к новому контроллеру домена, на котором либо были внесены изменения, либо они были реплицированы.

Вся оптимизация кэширования должна выполняться на вашей стороне, вам нужно решить, как часто вы хотите запрашивать свой домен для проверки обновлений членства.

person arizonawayfarer    schedule 14.07.2015