Проблемы с использованием управления синхронизацией контента LDAP / управления запросами на синхронизацию

Я пытаюсь использовать библиотеки .net System.DirectoryServices.Protocols для синхронизации с сервером ApacheDS Ldap с помощью управления синхронизацией содержимого LDAP (RFC), чтобы возвращались только изменения с момента последней синхронизации.

Мой первый поисковый запрос без значения файла cookie работает нормально, и я могу получить значение файла cookie из ответа поиска. Но когда я делаю последующий поисковый запрос и пытаюсь передать предыдущий файл cookie синхронизации, я получаю исключение «Сервер недоступен» при попытке отправить запрос.

Вот несколько фрагментов кода, с которым я работаю:

static void Main(string[] args)
{
    //LdapConnection, binding, etc removed for brevity

    string contentSynchronizationControlOID = "1.3.6.1.4.1.4203.1.9.1.1";
    string syncDoneControlOID = "1.3.6.1.4.1.4203.1.9.1.3";
    byte[] value = GetSyncControlValue();
    DirectoryControl syncRequestControl = new DirectoryControl(contentSynchronizationControlOID, value, true, true);
    syncRequest.Controls.Add(syncRequestControl);

    SearchResponse syncResponse = (SearchResponse)connection.SendRequest(syncRequest);
    foreach (var responseControl in syncResponse.Controls)
    {
        if (responseControl.Type == syncDoneControlOID)
        {
            SaveSyncControlCookie(responseControl.GetValue());
        }
    }
}


private static byte[] GetSyncControlValue()
{
    byte[] value = null;
    try
    {
        value = File.ReadAllBytes("cookie.bin");
    }
    catch { }

    if (value == null)
    {
        return value; 
    }
    else
    {
        object[] controlParts = new object[] { 1, value, false };
        value = BerConverter.Encode("{iob}", controlParts);
    }

    return value;
}

private static void SaveSyncControlCookie(byte[] value)
{
    byte[] result = null;
    object[] controlParts = BerConverter.Decode("{B}", value);

    result = (byte[])controlParts[0];

    if (result != null)
    {
        File.WriteAllBytes("cookie.bin", result);
    }

}

Я пробовал разные форматы для методов кодирования/декодирования BerConverter, но с другими комбинациями мне не повезло.


person Adam    schedule 25.03.2015    source источник


Ответы (1)


Моя проблема оказалась в строке формата при использовании BerConverter.Encode для создания значения управления синхронизацией, которое отправляется на сервер ldap с поисковым запросом.

Переключение с "{iob}" на "{eob}" решило проблему. Я предполагаю, что «i» используется для представления обычных целочисленных значений, а «e» следует использовать, когда значение int является значением перечисления? Не совсем уверен, но у меня сейчас работает =]

person Adam    schedule 25.03.2015