Есть ли способ установить тайм- аут привязки для соединения LDAP с помощью того System.DirectoryServices.Protocols.LdapConnection, что поставляется с.NET? Не путать с тайм -аутом соединения (это свойство Timeout ). По сути, мне нужно установить, LDAP_OPT_TIMELIMITкак описано здесь.
LdapSessionOptions кажется подходящим местом для этого, но, насколько я вижу, этой конкретной опции нет. Есть ли что-то еще, что мне не хватает?
Решение проблемы
Вот решение, которое я придумал:
private const int LDAP_OPT_TIMELIMIT = 0x04;
[DllImport("Wldap32.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ldap_set_optionW", CharSet = CharSet.Unicode)]
private static extern int ldap_set_option([In] IntPtr handle, [In] int option, [In] ref int inValue);
private static void SetLdapConnectionBindTimeout(LdapConnection conn, int timeoutSeconds)
{
// We need the underlying LdapConnection handle; that's internal, so reflection here we go.
var handleField = typeof(LdapConnection).GetField("ldapHandle", BindingFlags.NonPublic | BindingFlags.Instance);
var handleWrapper = handleField.GetValue(conn);
// That handle object is itself a wrapper class around the IntPtr we actually need.
// The wrapper class is internal, and so is the IntPtr, so more reflection.
var internalHandleField = handleWrapper.GetType().GetField("handle", BindingFlags.NonPublic | BindingFlags.Instance);
var internalHandle = (IntPtr)internalHandleField.GetValue(handleWrapper);
// Now we can set.
ldap_set_option(internalHandle, LDAP_OPT_TIMELIMIT, ref timeoutSeconds);
}
Это работает, но мне определенно не нравятся все эти отражения. Или DllImport, хотя библиотека.NET все равно использует это под прикрытием, поэтому я чувствую, что это не так уж важно.
Согласно приведенным ниже комментариям, здесь также полезно отметить, что из-за зависимости от Wldap32.dll, это может показаться только для Windows и не подходит для кроссплатформенности.
Комментариев нет:
Отправить комментарий