我在项目中使用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
应该同样有效。
答案 0 :(得分:2)
.DefaultCredentials只是为Subversion库提供一个显式用户名和密码的替代方法。
如果您需要更高级的提示机制,则应该在SvnClient.Autorization上挂钩.UserNamePassword事件。这也允许管理是否应该保存密码等。
SharpSvn.UI.dll中有一个默认实现,它挂钩了一些标准对话框。