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.
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