1

我在我的项目中使用 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 中出现 a:

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 方法返回的事实造成的。但是,正如ICredentials 接口上的 MSDN 文档中明确指出的那样:

GetCredential方法返回一个 NetworkCredential 实例,其中包含与指定 URI 和授权方案关联的凭据。当没有可用的凭据时,GetCredential方法返回null

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

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

4

1 回答 1

2

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

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

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

于 2011-04-29T19:03:02.993 回答