NullReferenceException в SharpSvn SvnClient, когда предоставленный DefaultCredentials возвращает ноль

Я использую SharpSvn в своем проекте для связи с SVN. Для некоторых репозиториев SVN я уже знаю имя пользователя и пароль, а для других - нет. Таким образом, я установил SvnClient.Authentication.DefaultCredentials свойство экземпляра моей собственной реализации System.Net.ICredentials (псевдокод):

public class MyCredentials : ICredentials
{
    public NetworkCredential GetCredential(Uri uri, string authType)
    {
        if (AreCredentialsKnown(uri))
            return new NetworkCredential("KnownUserName", "KnownPassword");
        else
            return null;
    }
}

Это хорошо работает для известных учетных данных. Однако, если учетные данные не известны, NullReferenceException происходит в SharpSvn:

Object reference not set to an instance of an object.
   at System.Net.NetworkCredential.InternalGetUserName()
   at System.Net.NetworkCredential.get_UserName()
   at SharpSvn.Implementation.SvnCredentialWrapper.OnUserNamePassword(Object sender, SvnUserNamePasswordEventArgs e) in f:\qqn\sharpsvn-dist-1.6\src\sharpsvn\svnauthentication.h:line 619

Видимо это связано с тем, что я возвращаюсь null из метода GetCredential. Однако, как ясно указано в документации MSDN об интерфейсе ICredentials:

Метод GetCredential возвращает экземпляр NetworkCredential, который содержит учетные данные, связанные с указанным URI и схемой авторизации. Если учетные данные недоступны, метод GetCredential возвращает значение NULL.

Это ошибка в SharpSvn? В противном случае, что я должен вернуть, если учетные данные не известны?

Редактировать: я только что обнаружил, что могу вернуться new NetworkCredentials() вместо null указать SharpSvn, что учетные данные неизвестны. Тем не менее, я думаю, что это ошибка в SharpSvn, как возвращение null должно работать одинаково хорошо.

1 ответ

Решение

.DefaultCredentials является только альтернативой для предоставления одного явного имени пользователя и пароля для библиотек Subversion.

Если вам нужен более продвинутый механизм запроса, вам нужно подключить событие.UserNamePassword к SvnClient.Autorization. Это также позволяет управлять сохранением паролей и т. Д.

В SharpSvn.UI.dll есть реализация по умолчанию, которая перехватывает некоторые стандартные диалоги.

Другие вопросы по тегам