NullReferenceException в SharpSvn SvnClient, когда предоставленный DefaultCredentials возвращает ноль - PullRequest
1 голос
/ 29 апреля 2011

Я использую 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;
    }
}

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

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 Ответ

2 голосов
/ 29 апреля 2011

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

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

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

...