c# - TFS WorkItemStore löst bei Verwendung der Authentifizierung eine COMException in der ASP.NET MVC-App aus

Translate

Ich bin völlig verblüfft und endlose Google / Stackoverflow-Suchen haben nicht geholfen. Ich verwende das 2012 Visual Studio SDK, um eine Verbindung zu TFS 2012 herzustellen und den Workitemspeicher abzufragen. Der folgende Code funktioniert sowohl in einer Konsolenanwendung als auch in einer ASP.NET MVC-App, die dies tut, einwandfreinichtVerwenden Sie die Authentifizierung oder in einem beliebigen Szenario, das auf meinem lokalen Computer ausgeführt wird. Ich bekomme jedoch eineCOMExceptionWenn ich versuche, einen WorkItemStore aus einer MVC-App heraus zu instanziieren, die auf dem Server bereitgestellt wurde und die (Windows-) Authentifizierung verwendet.

Es macht keinen Unterschied, ob ich das habe<authentication mode="Windows" />Element in meiner web.config oder nicht; solange es eine gibt[Authorize]Bei einem Attribut auf meinem Controller oder einer seiner Aktionsmethoden wird eine Ausnahme angezeigt, sobald die letzte Codezeile unten aufgerufen wird. Wenn ich das entferne[Authorize]Attribut, die Ausnahme tritt nicht auf. Wenn ich irgendwann den folgenden Code aufrufeVorRufnummer verziert mit[Authorize]tritt die Ausnahme nicht auf. Irgendwie löst die Verwendung von AuthorizeAttibute diese Ausnahme aus.

Irgendwelche Ideen, wie man das löst? Oder zumindest, um das eigentliche Grundproblem genauer zu identifizieren? Ich würde wirklich gerne verstehen, was hier los ist.

Uri tfsAddress = new Uri("http://tfs-address:8080/tfs/DefaultCollection");
var myCreds = new NetworkCredential("userName", "password", "domain");
var tfsCreds = new TfsClientCredentials(new WindowsCredential(myCreds), false);

var defaultCollection = new TfsTeamProjectCollection(tfsAddress, tfsCreds);
defaultCollection.EnsureAuthenticated();

var store = defaultCollection.GetService<WorkItemStore>(); // <-- EXCEPTION

Stapelspur:

[COMException (0x80004005): Fehler HRESULT E_FAIL wurde von einem Aufruf einer COM-Komponente zurückgegeben.]

Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.DataStoreNative.BeginDataStoreInit (IntPtr-Handle, String defaultCachePath, String instanceId, Int32 cacheVersion) +0

Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.Datastore.BeginDataStoreInit (Zeichenfolge defaultCachePath, Zeichenfolge instanceId, Int32 cacheVersion) +56

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore.InitializeInternal () +598

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore.Microsoft.TeamFoundation.Client.ITfsTeamProjectCollectionObject.Initialize (TfsTeamProjectCollection teamProjectCollection) +23

Microsoft.TeamFoundation.Client.TfsTeamProjectCollection.InitializeTeamFoundationObject (Zeichenfolge fullName, Objektinstanz) +43

Microsoft.TeamFoundation.Client.TfsConnection.CreateServiceInstance (Assembly Assembly, String fullName) +91

Microsoft.TeamFoundation.Client.TfsConnection.GetServiceInstance (Typ serviceType, Object serviceInstance) +200

Microsoft.TeamFoundation.Client.TfsTeamProjectCollection.GetServiceInstance (Typ serviceType, Object serviceInstance) +439

Microsoft.TeamFoundation.Client.TfsConnection.GetService (Typ serviceType) +241

Microsoft.TeamFoundation.Client.TfsConnection.GetService () +58

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Die Lösung bestand darin, die Identität des AppPool der Anwendung entweder in ein Domänenkonto oder in zu ändernLocalSystem.

Ich kann nicht sagen, dass ich vollständig verstehe, was hier hinter den Kulissen vor sich geht, aber es scheint, dass es einen Konflikt zwischen der authentifizierten Identität des Benutzers, der auf der Website surft, und der AppPool-Identität gab, die ursprünglich die Standardeinstellung warApplicationPoolIdentity. Wenn die Hauptursache des Problems ein nicht autorisierter Zugriff oder ähnliches ist, scheint es mir, dass ich die gleiche Ausnahme sowohl für anonyme als auch für authentifizierte Benutzer hätte bekommen sollen. Ich würde auch eine tatsächliche Ausnahme für nicht autorisierten Zugriff erwarten, keine "undefinierte" COMException, daher weiß ich wirklich nicht, was die eigentliche Grundursache ist. Wenn jemand auf diese Frage stößt und sie näher erläutern möchte, tun Sie dies bitte.

Quelle
Translate

Für mich tritt dieser Fehler unter bestimmten Umständen auf, z. B. wenn ich eine neue Site in lokalem IIS erstellt habe, die die TFS-API verwendet. Ich habe sogar die Kommentare hier ohne Erfolg verfolgt, ich hatte die AppPool-Identität auf LocalSystem gesetzt. Ich hatte einen separaten App-Pool. Ich hatte 32-Bit-Anwendungen für die TFS-API aktiviert.

Für mich hörte das Problem auf, als ich den App-Pool von Framework v4.0 auf v2.0 und dann zurück auf v4.0 änderte.

Ich weiß nicht, warum es das Problem behoben hat, aber es hat bei mir funktioniert.

Quelle
Translate

Die akzeptierte Antwort funktionierte für mich, schien aber nicht optimal zu sein. Ich konnte dies beheben, indem ich auch die folgenden Cache-Verzeichnisse löschte und / oder dem Benutzer des Anwendungspools Berechtigungen erteilte.

Windows 7:

C:\ProgramData\Microsoft Team Foundation

Windows 8.1:

C:\ProgramData\Microsoft\Team Foundation

Diese Ordner scheinen immer dann erstellt zu werden, wenn meine Anwendungen das TFS SDK verwenden.

Quelle
Leave a Reply
You must be logged in to post a answer.
Über den Autor