Ошибка "NullReferenceException была необработанной", возникающая при доступе к SourceControl через C#

Вот мой кусок кода, через который я пытаюсь получить доступ к TFS Server SourceControl:

TeamFoundationServer tfs = new TeamFoundationServer("http://test-server:8080/tfs/CollectionName");
VersionControlServer sourceControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));

RecursionType recursion = RecursionType.OneLevel;
Item[] items = null;
ItemSet itemSet = sourceControl.GetItems("$/Product/", recursion);
items = itemSet.Items;

Но то, что я получаю, это ноль на sourceControl когда я отлаживаю код. Мой путь к TFS-серверу также правильный, я не получаю значения в переменной sourceControl

3 ответа

Ваш сервер не может быть найден:

TeamFoundationServer.GetService метод возвращает Null если услуга не может быть найдена.

Смотрите: MSDN Документация

Убедитесь, что программа может получить доступ к порту (проверьте брандмауэр и попробуйте telnet в test-server:8080)

Более того, как предлагалось в комментариях, TeamFoundationServer.EnsureAuthenticated метод, может помочь указать, когда URI недействителен.

Вы попробуйте следующие строки кода. Что приведет вас к диалоговому окну, чтобы выбрать онлайн-проекты TFS. Если какие-либо онлайн-проекты доступны внутри, выберите проект и нажмите кнопку "Подключиться". В случае успеха вы должны получить экземпляр VersionControlServer, в противном случае система, на которую реагирует система, действительна, поскольку у вас нет сетевых проектов для подключения.

                 TfsTeamProjectCollection _tpc = null;
                 using (var picker = new TeamProjectPicker(TeamProjectPickerMode.NoProject, false))
                 {
                     if (picker.ShowDialog() == DialogResult.OK)
                     {
                        _tpc = picker.SelectedTeamProjectCollection;
                     }

                     if (_tpc == null)
                     {
                         MessageBox.Show("Please select a team project.");
                         return;
                     }

                    var versionControl = (VersionControlServer)_tpc.GetService(typeof(VersionControlServer));

Вместо того, чтобы писать жестко закодированный путь Tfs, попробуйте следующий код, который ищет все онлайн-проекты TFS.

List<RegisteredProjectCollection> projectCollections = new List<RegisteredProjectCollection>((RegisteredTfsConnections.GetProjectCollections()));

        // filter down to only those collections that are currently on-line
        var onlineCollections =
            from collection in projectCollections
            where collection.Offline == false
            select collection;

        // fail if there are no registered collections that are currently on-line
        if (onlineCollections.Count() < 1)
        {
            Console.Error.WriteLine("Error: There are no on-line registered project collections");
            Environment.Exit(1);
        }

        // find a project collection with at least one team project
        foreach (var registeredProjectCollection in onlineCollections)
        {
            var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(registeredProjectCollection);

            Workspace workspace = null;
            Boolean createdWorkspace = false;
            String newFolder = String.Empty;

            try
            {
                var versionControl = (VersionControlServer)projectCollection.GetService(typeof(VersionControlServer));

                var teamProjects = new List<TeamProject>(versionControl.GetAllTeamProjects(false));
            //.......
            }
        }
Другие вопросы по тегам