2013-11-19 2 views
6

Я полностью в тупике от этого и бесконечного поиска google/stackoverflow не помог. Я использую SDK 2012 Visual Studio для подключения к TFS 2012 и запрашиваю хранилище рабочих элементов. В приведенном ниже коде отлично работает как консольное приложение, так и приложение ASP.NET MVC, которое делает не аутентификацией, либо в любом сценарии, запущенном на моем локальном компьютере. Тем не менее, я получаю COMException, когда пытаюсь создать экземпляр WorkItemStore из приложения MVC, которое было развернуто на сервере, и использует (Windows) аутентификацию.TFS WorkItemStore вызывает COMException в приложении ASP.NET MVC при использовании аутентификации

Не имеет значения, если у меня есть элемент <authentication mode="Windows" /> в моем web.config или нет; пока на моем контроллере или любом из его методов действия есть атрибут [Authorize], я получаю исключение, как только вызывается последняя строка кода ниже. Если я удалю атрибут [Authorize], исключение не произойдет. Если я вызываю код ниже в какой-то момент до код вызова, украшенный [Authorize], исключение не возникает. Как-то использование AuthorizeAttibute вызывает это исключение.

Любые идеи о том, как разрешить это? Или, по крайней мере, для более точной идентификации реальной проблемы с корнем? Я бы очень хотел понять, что здесь происходит.

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 

Стек трассировки:

[COMException (0x80004005):. Ошибка HRESULT E_FAIL был возвращен из вызова к COM-компонента]

Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.DataStoreNative .BeginDataStoreInit (IntPtr ручка, String defaultCachePath, String INSTANCEID, Int32 cacheVersion) +0

Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.Datastore.BeginDataStoreInit (String defaultCachePath, String INSTANCEID, В T32 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 (String FULLNAME, объект экземпляра) +43

Microsoft.TeamFoundation.Client.TfsConnection.CreateServiceInstance (монтаж Монтаж , Строка FULLNAME) +91

Microsoft.TeamFoundation.Client.TfsConnection.GetServiceInstance (тип ServiceType, serviceInstance Объект) +200

Microsoft.TeamFoundation.Client.TfsTeamProjectCollection.GetServiceInstance (тип ServiceType, serviceInstance Объект) +439

Microsoft.TeamFoundation.Client.TfsConnection.GetService (тип ServiceType) +241

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

ответ

9

Решение было изменить личность AppPool приложения либо к учетной записи домена или к LocalSystem.

Я не могу сказать, что я полностью понимаю, что происходит за кулисами здесь, но, похоже, какой-то конфликт между аутентифицированным идентификатором пользователя, просматривающего сайт, и идентификатором AppPool, который первоначально был по умолчанию ApplicationPoolIdentity. Если основной причиной проблемы является несанкционированный доступ или что-то подобное, мне кажется, что я должен был получить такое же исключение для анонимных пользователей, а также для аутентифицированных. Я также ожидал бы фактического исключения Unauthorized Access Exception, а не «undefined» COMException, поэтому я действительно не знаю, какова настоящая первопричина. Если кто-то сталкивается с этим вопросом и заботится о его разработке, пожалуйста, сделайте это.

+0

Ник, вы сохранили Авторизованный атрибут на своем контроллере? Как вы настроили аутентификацию IIS, то есть спросить, какие модули включены? Я получаю ту же ошибку и пока не нашел решение. Я использую олицетворение ASP.NET и проверку подлинности Windows. – MADCookie

+1

Я сохранил 'AuthorizeAttribute' на моем контроллере, да. Я только что проверил IIS и (что удивительно), единственным модулем является «Анонимная аутентификация». Мы переместили наш IIS на новый сервер, так как я разместил этот вопрос. Я почти уверен, что раньше у меня была активирована «Аутентификация Windows», но в любом случае сайт работает правильно, поэтому я не возился с ним. :-) –

6

Для меня эта ошибка появляется в определенных ситуациях, например, когда я создал новый сайт в локальном IIS, который использует TFS API. Я даже следил за комментариями здесь безрезультатно, у меня была идентификация AppPool для LocalSystem. У меня был отдельный пул приложений. Я включил 32-битные приложения для TFS API.

Для меня проблема прекратилась, когда я изменил пул приложений с фреймворка v4.0 на v2.0, а затем вернулся к версии 4.0.

Я не знаю, почему он исправил проблему, но это сработало для меня.

2

Принимаемый ответ сработал для меня, но не казался оптимальным. Я смог исправить это, удалив нижеуказанные кэш-каталоги и/или предоставив пользователям права доступа к пулу приложений.

Windows 7:

C:\ProgramData\Microsoft Team Foundation 

для Windows 8.1:

C:\ProgramData\Microsoft\Team Foundation 

Эти папки, кажется, создается всякий раз, когда мои приложения используют TFS SDK.

+0

То же самое, после того, как я удалил папку, показанную выше, все сработало нормально. –