当提供的DefaultCredentials返回null时,SharpSvn的SvnClient中的NullReferenceException

时间:2011-04-29 10:24:08

标签: c# .net svn sharpsvn

我在项目中使用SharpSvn与SVN进行通信。对于一些SVN repostories,我已经知道用户名和密码,而对于其他人,我没有。因此,我将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

这显然是由于我从GetCredential方法返回null这一事实。但是,正如the MSDN documentation on the ICredentials interface明确指出的那样:

  

GetCredential 方法返回NetworkCredential实例,该实例包含与指定的URI和授权方案关联的凭据。如果没有可用的凭据, GetCredential 方法将返回 null

这是SharpSvn中的错误吗?否则,当凭证未知时我应该返回什么?

修改:我刚刚发现我可以返回new NetworkCredentials()而不是null来向SharpSvn表明凭据未知。不过,我认为这是SharpSvn中的一个错误,因为返回null应该同样有效。

1 个答案:

答案 0 :(得分:2)

.DefaultCredentials只是为Subversion库提供一个显式用户名和密码的替代方法。

如果您需要更高级的提示机制,则应该在SvnClient.Autorization上挂钩.UserNamePassword事件。这也允许管理是否应该保存密码等。

SharpSvn.UI.dll中有一个默认实现,它挂钩了一些标准对话框。