1

我喜欢通过 C# 代码检查文件,但我总是收到 TF14098 Acess Denied Exception。TFS 管理员向我保证,我有签出/编辑权限,并且在 VisualStudio 和 tf.exe 中签出文件没有任何问题。

这是我当前的 C# 代码:

            const string tfsServer = @"http://MyServer:8080/tfs";
        const string fileName = @"$/MyFile.xaml";
        const string workspaceName = "MyWorkspace";

        using (TfsTeamProjectCollection tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsServer)))        
        {               
            if (tfs != null)
            {
                WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName);
                if (null != workspaceInfo)
                {
                    var vcs = tfs.GetService<VersionControlServer>();   
                    Workspace workspace = workspaceInfo.GetWorkspace(tfs);                                  
                    if(workspace == null){

                        workspace = vcs.GetWorkspace(workspaceName, vcs.AuthorizedUser);
                    }                   

                    vcs.NonFatalError +=    VersionControlOnNonFatalError;
                    vcs.Getting += OnGetting;
                    vcs.BeforeCheckinPendingChange += OnBeforeCheckinPendingChange;
                    vcs.NewPendingChange += OnNewPendingChange;

                    if (workspace != null)
                    {
                        workspace.PendEdit(fileName);
                    }                       
                }
            }
        }

结果总是:

非致命故障:TF14098:访问被拒绝:用户 Me 需要 $/MyFile.xaml 的 PendChange 权限。

在对此错误进行了大量研究后,我尝试通过 Dos-Box 检查权限,并执行了以下命令行:

tf checkout $/MyFile.xaml

它可以毫无问题地签出文件!(如果我在文件抵抗的目录中)

有没有人知道问题可能是什么?我的代码(我用 VisualStudio2012 编写和执行的应用程序)和命令行 tf checkout 有什么区别?

感谢您的提示和提示!帕特里克

4

1 回答 1

1

您的代码中的问题是,TfsTeamProjectCollection不适合您的路径,因为您从未设置集合名称(应该类似于 @"http://MyServer:8080/tfs/DefaultCollection")。我从来没有使用 API 进行过结帐,但我从这样开始进行了签入:

WorkspaceInfo wi = Workstation.Current.GetLocalWorkspaceInfo(Environment.CurrentDirectory);
TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(wi.ServerUri);

VersionControlServer versionControlServer = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
Workspace workSpace = versionControlServer.GetWorkspace(wi);

如您所见,我使用我的工作区搜索 TeamCollection,而不是将其设置为独立。这样做,您将有权VersionControlServer进行结帐。

使用 tf.exe 工具的不同之处在于,您在本地工作区中运行它,因此该工具知道它在 TFS 中链接到哪个项目以及哪个集合。

于 2013-01-24T07:50:33.207 回答