2012-02-06 2 views
6

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

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

Вот как я подключении ...

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."); 
    } 

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

+0

Дополнительная информация: тот же код отлично работает на компьютере в нашем домене, используя windows auth и олицетворение. Думаю, я не могу сделать это из-за пределов домена? Я могу из Visual Studio, так что это не имеет смысла. Может быть, если я смогу олицетворять пользователя домена, даже если я не в домене? – sonicblis

ответ

2

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

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); 
     } 
    } 
} 
+1

Работает в консольном приложении (после добавления аутентификации), не работает в моем веб-приложении. Та же ошибка, что и попытка B в моем вопросе. – sonicblis

+0

Мне жаль, что это не сработало для вас – pantelif

0

Я считаю, что this article может быть в состоянии ответить на ваш вопрос. Он говорит, что если создать экземпляр 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> 

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

Смежные вопросы