2012-02-06 7 views
6

Próbowałem dwóch sposobów łączenia się z workitstore dla serwera TFS, który używamy. Próba A polegała na połączeniu z serwerem konfiguracji i użyciu metody GetService<WorkItemStore>(). To zawsze zwraca wartość null.W jaki sposób można połączyć się ze sklepem pracy TFS 2010?

Próba B miała połączyć się z TfsTeamProjectCollection i użyć metody GetService<WorkItemStore>() lub przekazać kolekcję projektów do konstruktora WorkItemStore. W przypadku próby B otrzymuję wyjątek stwierdzający "Błąd HRESULT E_FAIL został zwrócony z wywołania do składnika COM." Jedyne informacje, jakie mogę znaleźć na ten temat, wydają się wskazywać na pewien problem z uprawnieniami, ale potwierdziłem, że jestem uwierzytelniony jako użytkownik z dostępem do odczytu do całej kolekcji projektu i łączę się i wtrącam odpowiednio za pośrednictwem podglądu systemu VS 2011.

Oto jak łączę ...

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; 
    } 

a oto jak próbuję uzyskać WorkItemStore (kod głupie do zilustrowania problemu) ...

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 nie znajduje się w tej samej domenie co serwer, ale uwierzytelniam się jako użytkownik domeny przy pomocy ICredentialsProvider i potwierdziłem, że jestem uwierzytelniony jako ten użytkownik. Wszelkie wskazówki byłyby pomocne.

+0

Informacje dodatkowe: Ten sam kod działa poprawnie na komputerze w naszej domenie przy użyciu uwierzytelniania systemu Windows i personifikacji. Chyba nie mogę tego zrobić spoza domeny? Mogę z Visual Studio, więc to nie ma sensu. Może gdybym mógł podszyć się pod użytkownika domeny, nawet jeśli nie jestem w domenie? – sonicblis

Odpowiedz

2

Sprawdź, czy robi to, co trzeba:

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

Działa w aplikacji konsoli (po dodaniu uwierzytelniania), nie działa w mojej aplikacji internetowej. Ten sam błąd co próba B w moim pytaniu. – sonicblis

+0

Przykro mi, że to się nie udało – pantelif

0

wierzę this article może być w stanie odpowiedzieć na to pytanie. Mówi, że jeśli instancję swoje WorkItemStore w nieco inny sposób, dostaniesz inny wyjątek:

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.

Rozwiązaniem jest prosta zmiana web.config, dodając następujący:

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

Mam nadzieję, że to pomoże! Pracował dla mnie, gdy miałem ten sam błąd.

Powiązane problemy