System.DirectoryServices привязывает мой процессор при многопоточности - могу ли я снизить нагрузку? - PullRequest
1 голос
/ 23 февраля 2009

Мое приложение принимает текущего пользователя, вошедшего в систему, и использует DirectoryServices.DirectorySearcher для получения дополнительной информации о них (некоторые свойства мы сохранили в нескольких настраиваемых полях AD, а также их адрес электронной почты). Это прекрасно работает, хотя я всегда был немного медленным - мой однопоточный код мог обрабатывать только около 2-3 запросов в секунду.

Настоящая проблема возникла, когда я переместил этот код на веб-сервер. При одновременном использовании нескольких пользователей количество запросов в секунду значительно возрастает, и процесс LSASS.EXE привязывается к моему серверу. Я проверил контроллеры домена, и они просто в порядке - узкое место явно на стороне приложения. Я подозреваю, что то, что замедляет меня, - это запрос / ответ NTLM / Kerberos, а количество одновременных запросов привязывает даже многоядерный процессор.

Наша сетевая политика не допускает анонимного чтения из AD, поэтому выбор отсутствует. Кроме того, я пробовал каждый элемент «AuthenticationTypes» (в примере я использую .FastBind), но все они, похоже, имеют примерно одинаковую пропускную способность при одинаковой нагрузке на процессор.

У кого-нибудь есть идеи, как мне обойти это ограничение и снизить требования к процессору?

Вот код, который я использую - довольно просто:

Dim sPath As String = "LDAP://" & stringUserDN
Dim entry As New DirectoryEntry(sPath)
entry.AuthenticationType = AuthenticationTypes.FastBind

For Each stringADNumber As String In entry.Properties(_ADPROP_EMPLOYEENUMBER)
    'return first item
    Return Convert.ToInt32(stringADNumber)
Next

Return String.Empty

1 Ответ

1 голос
/ 23 февраля 2009

У меня нет опыта поиска предметов в AD. Тем не менее, одно предложение заключается в том, что вы можете проверить HttpContext для запроса. Для текущего пользователя, который делает запрос, есть некоторая базовая информация, такая как информация о группах, SID и токене. Я не верю, что по умолчанию есть поле адреса электронной почты, но вы можете использовать свойство User.Name + "@your.domain" для создания адреса электронной почты.

Для отображения этих данных вам потребуется IIS, требующий аутентификации для запросов. Анонимные пользователи не будут заполнять эти данные. Accessor для этих данных - HttpContext.Current.Request.LogonUserIdentity или, в качестве альтернативы, в коде для вашей страницы, вы можете позвонить this.Request.LogonUserIdentity для краткости.

Надеюсь, это поможет. Удачи.

...