Я пытаюсь использовать библиотеки .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, но с другими комбинациями мне не повезло.