Ошибка SVN COPY: метод 501 не реализован

Мы используем VisualSVN (стандартная версия) уже несколько лет без каких-либо проблем. У нас есть приложение C#, которое хранит данные в SVN. Он использует библиотеку SharpSvn (https://sharpsvn.open.collab.net) для доступа к SVN. Время от времени приложение выполняет серверную команду SVN COPY («RemoteCopy» SharpSvn), чтобы создать ветку на основе ряда существующих в репозитории файлов.

Недавно мы обновили VisualSVN с версии 2.5.2 до 3.2.2, а также приобрели лицензию, чтобы разблокировать корпоративные функции продукта. Мы включили встроенную проверку подлинности Windows, но также сохранили обычную проверку подлинности для обратной совместимости.

После недели работы без каких-либо проблем (выполнение только чтения из SVN) наше приложение попыталось выполнить копирование в первый раз, и оно потерпело неудачу со следующей ошибкой, жалующейся на один из файлов, которые нужно было скопировать:

«Запрос COPY на ‘/svn/repository/!svn/rvr/12345/trunk/file.xml’ не выполнен: метод 501 не реализован»

Журнал сервера показывает следующее:

Level,Date and Time,Source,Event ID,Task Category
Error,2015-03-03 9:37:26 AM,VisualSVN Server 3.2,1001,Apache,"Multi-author commits not supported.  [501, #175002] [client 192.168.1.100]"
Error,2015-03-03 9:37:26 AM,VisualSVN Server 3.2,1001,Apache,"Could not fetch resource information.  [501, #0] [client 192.168.1.100]"
Error,2015-03-03 9:37:26 AM,VisualSVN Server 3.2,1001,Apache,"SSPI Challenge failed: The token supplied to the function is invalid [client 192.168.1.100]"
Error,2015-03-03 9:37:21 AM,VisualSVN Server 3.2,1001,Apache,"SSPI Challenge failed: The token supplied to the function is invalid [client 192.168.1.100]"

После перезапуска службы VisualSVN команда выполнилась без проблем. Такого никогда не было со старыми версиями VisualSVN.

Вот как мы создаем ветку с помощью SharpSvn:

    private static void Branch(ICollection<SvnUriTarget> sources, Uri targetUri, string comment, string userName, string password)
    {
        if (sources == null) throw new ArgumentNullException("sources");
        if (targetUri == null) throw new ArgumentNullException("targetUri");
        if (comment.IsNullEmptyOrSpaces()) throw new ArgumentNullException("comment");
        if (userName.IsNullEmptyOrSpaces()) throw new ArgumentNullException("userName");
        if (password.IsNullEmptyOrSpaces()) throw new ArgumentNullException("password");

        using (var client = new SvnClient())
        {
            client.Authentication.Clear();
            client.Authentication.DefaultCredentials = new NetworkCredential(userName, password);
            client.Authentication.SslServerTrustHandlers += (sender, e) => { e.AcceptedFailures = e.Failures; e.Save = true; };

            SvnCommitResult commitResult;
            if (!client.RemoteCopy(sources, targetUri, new SvnCopyArgs { CreateParents = true, LogMessage = comment }, out commitResult))
                throw new ApplicationException("Failed to create tag/branch in Repository");
        }
    }

В нашем приложении мы по-прежнему используем обычную аутентификацию, и учетные данные явно передаются при каждом вызове SharpSvn. Приложение запрашивает учетные данные у пользователя, а затем использует эти учетные данные для выполнения одного вызова метода «Ветвь». Два разных пользователя пытались сделать это, используя свои собственные учетные данные на двух разных машинах, с одинаковым результатом. Только перезапуск службы VisualSVN решил проблему. Боюсь, что эта проблема может вернуться снова...


person kazakm    schedule 04.03.2015    source источник
comment
stackoverflow.com/q/561855/62576   -  person Ken White    schedule 05.03.2015
comment
@Ken White: я видел это и не знаю, как это связано с моей проблемой, хотя сообщение об ошибке такое же.   -  person kazakm    schedule 05.03.2015
comment
Делали ли вы какие-либо настройки в httpd-custom.conf? Какую версию SharpSvn вы используете?   -  person Ivan Zhakov    schedule 05.03.2015
comment
@ivanzhakov: Нет, мы не трогали httpd-custom.conf. Мы используем SharpSvn версии 1.8008.3178.19, но также пробовали версию 1.8009.3299.43 с тем же результатом.   -  person kazakm    schedule 05.03.2015
comment
@kazakm Может быть, у вас есть кешированные учетные данные в %APPDATA%\Subversion\auth? Насколько я понимаю лог-сообщения, ситуация такова: первые запросы выполняются с использованием одних учетных данных, вторые - с использованием других (кэшированных?) учетных данных. Были ли у вас какие-либо связанные ошибки в журналах безопасности?   -  person Ivan Zhakov    schedule 05.03.2015
comment
@IvanZhakov Я предоставил больше информации в своем исходном сообщении, а также включил полную реализацию метода Branch. Приложение работает на компьютерах, на которых также установлена ​​TortoiseSVN, и пользователи получают доступ к репозиторию, используя оба приложения. Они также имеют тенденцию сохранять учетные данные в TortoiseSVN (флажок в диалоговом окне учетных данных). К сожалению, я больше не вижу старые сообщения журнала безопасности. Они были стерты.   -  person kazakm    schedule 05.03.2015
comment
@kazakm Смотрите мой ответ: в основном операция по-прежнему выполняется с использованием учетных данных вошедшего в систему пользователя, поскольку встроенная аутентификация считается более приоритетной.   -  person Ivan Zhakov    schedule 05.03.2015
comment
@IvanZhakov Но почему это сработало после перезапуска службы VisualSVN? Это должно было продолжаться с ошибкой... Кроме того, другие операции, связанные с доступом к SVN с использованием того же механизма аутентификации, работали нормально даже до перезапуска.   -  person kazakm    schedule 09.03.2015
comment
@kazakm Кстати, сколько файлов вы пытаетесь скопировать? Я спрашиваю, потому что обнаружил еще одну связанную ошибку, связанную с тем, что svn не может зафиксировать более 10 КБ файлов с использованием NTLM.   -  person Ivan Zhakov    schedule 27.03.2015
comment
@IvanZhakov В данном конкретном случае приложение пыталось скопировать около 1800 файлов.   -  person kazakm    schedule 31.03.2015
comment
@kazakm Еще одно уточнение: вы скопировали один каталог с 1800 файлами или параметр sources имеет 1800 записей?   -  person Ivan Zhakov    schedule 31.03.2015
comment
@IvanZhakov пытался скопировать 1800 отдельных источников   -  person kazakm    schedule 07.04.2015


Ответы (1)


Вы должны отключить SharpSvn (и Subversion), чтобы использовать встроенную аутентификацию («ntlm» и «negotiate»), если вы собираетесь указать учетные данные для работы.

Попробуйте добавить такой код:

client.Configuration.SetOption("servers", "global", "http-auth-types", "basic");

Вероятно, это ошибка в Subversion, SharpSvn или serf, но предложенный обходной путь должен работать.

person Ivan Zhakov    schedule 05.03.2015