SVN COPY错误:501方法未实现

时间:2015-03-04 21:33:32

标签: c# svn visualsvn-server sharpsvn

我们已经使用VisualSVN(标准版)几年没有任何问题。我们有一个C#应用程序,用于在SVN中存储数据。它使用SharpSvn(https://sharpsvn.open.collab.net)库进行SVN访问。有时,应用程序执行服务器端SVN COPY命令(SharpSvn的“RemoteCopy”),以根据存储库文件中存在的一系列创建分支。

我们最近将VisualSVN从版本2.5.2更新为3.2.2,并购买了许可证以解锁产品的企业功能。我们启用了集成Windows身份验证,但也保留了基本身份验证以实现向后兼容。

在没有任何问题的情况下运行一周后(仅执行从SVN读取),我们的应用程序尝试首次执行该副本,并且失败并出现以下错误,抱怨其中一个必须复制的文件:

“'/svn/repository/!svn/rvr/12345/trunk/file.xml'上的COPY请求失败:501方法未实现”

服务器日志显示以下内容:

Level,Date and Time,Source,Event ID,Task Category
Error,2015-03-03 9:37:26 AM,VisualSVN Server 3.2,1001,Apache,"Multi-author commits not supported.  [501, #175002] [client 192.168.1.100]"
Error,2015-03-03 9:37:26 AM,VisualSVN Server 3.2,1001,Apache,"Could not fetch resource information.  [501, #0] [client 192.168.1.100]"
Error,2015-03-03 9:37:26 AM,VisualSVN Server 3.2,1001,Apache,"SSPI Challenge failed: The token supplied to the function is invalid [client 192.168.1.100]"
Error,2015-03-03 9:37:21 AM,VisualSVN Server 3.2,1001,Apache,"SSPI Challenge failed: The token supplied to the function is invalid [client 192.168.1.100]"

重新启动VisualSVN服务后,命令完成没有任何问题。以前从未发生过旧版本的VisualSVN。

这是我们使用SharpSvn创建分支的方式:

    private static void Branch(ICollection<SvnUriTarget> sources, Uri targetUri, string comment, string userName, string password)
    {
        if (sources == null) throw new ArgumentNullException("sources");
        if (targetUri == null) throw new ArgumentNullException("targetUri");
        if (comment.IsNullEmptyOrSpaces()) throw new ArgumentNullException("comment");
        if (userName.IsNullEmptyOrSpaces()) throw new ArgumentNullException("userName");
        if (password.IsNullEmptyOrSpaces()) throw new ArgumentNullException("password");

        using (var client = new SvnClient())
        {
            client.Authentication.Clear();
            client.Authentication.DefaultCredentials = new NetworkCredential(userName, password);
            client.Authentication.SslServerTrustHandlers += (sender, e) => { e.AcceptedFailures = e.Failures; e.Save = true; };

            SvnCommitResult commitResult;
            if (!client.RemoteCopy(sources, targetUri, new SvnCopyArgs { CreateParents = true, LogMessage = comment }, out commitResult))
                throw new ApplicationException("Failed to create tag/branch in Repository");
        }
    }

在我们的应用程序中,我们仍在使用基本身份验证,并且凭据明确传递给每个SharpSvn调用。应用程序从用户请求凭据,然后它使用这些凭据执行“分支”方法的单个调用。 两个不同的用户尝试使用他们自己的凭据在两台不同的机器上执行此操作,结果相同。只有重新启动VisualSVN服务才能解决问题。我担心这个问题可能会再次出现......

1 个答案:

答案 0 :(得分:1)

如果您要指定操作凭据,则应禁用SharpSvn(和Subversion)以使用集成身份验证(&#39; ntlm&#39;以及&#39;协商&#39;)。

尝试添加以下代码:

client.Configuration.SetOption("servers", "global", "http-auth-types", "basic");

可能这是Subversion,SharpSvn或serf中的一个错误,但建议的解决方法应该有效。