Как успешно подключиться к хранилищу рабочих элементов TFS 2010? - PullRequest
6 голосов
/ 06 февраля 2012

Я пробовал два способа подключения к рабочему хранилищу сервера TFS, на котором мы работаем. Попытка А состояла в том, чтобы подключиться к серверу конфигурации и использовать метод GetService<WorkItemStore>(). Это всегда возвращает ноль.

Попытка B состояла в том, чтобы подключиться к TfsTeamProjectCollection и использовать метод GetService<WorkItemStore>() или передать коллекцию проектов в конструктор WorkItemStore. При попытке B я получаю исключение, заявляющее, что «ошибка HRESULT E_FAIL была возвращена после вызова компонента COM». Единственная информация, которую я могу найти по этому вопросу, похоже, указывает на некоторые проблемы с разрешениями, но я подтвердил, что я аутентифицирован как пользователь с доступом для чтения ко всей коллекции проектов, и я подключаюсь и вмешиваюсь соответствующим образом с помощью предварительного просмотра VS 2011 dev.

Вот как я подключаюсь ...

    public TfsConfigurationServer GetConfigurationServer()
    {
        Uri tfsUri = new Uri(configs.TfsUri);
        TfsConfigurationServer server = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri, credProvider);
        server.Authenticate();
        if (server.HasAuthenticated == false)
            throw new InvalidOperationException("You can't authenticate against the tfs instance.");
        return server;
    }

    public TfsTeamProjectCollection GetProjectCollectionInstance(string projectCollectionName)
    {
        Uri tfsUri = new Uri(configs.TfsUri + "/" + projectCollectionName);         
        TfsTeamProjectCollection collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(tfsUri, credProvider);
        collection.Authenticate();
        if (collection.HasAuthenticated == false)
            throw new InvalidOperationException("You can't authenticate against the tfs instance.");
        return collection;
    }

и вот как я пытаюсь получить WorkItemStore (глупый код для иллюстрации проблемы) ...

    public WorkItemProvider()
    {
        if (workItems == null)
            workItems = ServerProvider.ServerInstance.GetService<WorkItemStore>();
        if (workItems == null)
            workItems = ServerProvider.ProjectCollectionInstance.GetService<WorkItemStore>();
        if (workItems == null)
            workItems = new WorkItemStore(ServerProvider.ProjectCollectionInstance);
        if (workItems == null)
            throw new NullReferenceException("Couldn't load work item store.");
    }

Я не в том же домене, что и сервер, но я аутентифицируюсь как пользователь домена с ICredentialsProvider, и я подтвердил, что я аутентифицирован как этот пользователь. Любые указатели будут полезны.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Проверьте, делает ли это то, что вам нужно:

using System;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;

namespace GetsWorkItem
{
    class Program
    {
        static void Main()
        {
            TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://<TFS>:8080/tfs/<COLLECTION>"));
            WorkItemStore workItemStore= (WorkItemStore) teamProjectCollection.GetService(typeof (WorkItemStore));

            WorkItem workItem = workItemStore.GetWorkItem(1234);
        }
    }
}
0 голосов
/ 21 марта 2013

Я считаю, эта статья может ответить на ваш вопрос. В нем говорится, что если вы создадите экземпляр WorkItemStore немного другим способом, вы получите другое исключение:

System.TypeInitializationException: The type initializer for ‘Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore’ threw an exception. —> System.IO.FileLoadException: Mixed mode assembly is built against version ‘v2.0.50727′ of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

Исправление представляет собой простое изменение web.config, добавив следующее:

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>

Надеюсь, это поможет! Работал на меня, когда получал ту же ошибку.

...