2016-01-21 1 views
2

Я пытаюсь реализовать простую службу опроса, которая запрашивает наш экземпляр TFS для результатов сборки (в конце концов это будет показано на мониторе сборки в офисе). Следуя примерам here, я придумал следующую попытку:NullReferenceException при опросе Microsoft.VisualStudio.Services.Client для сборок

var uri = new Uri("http://tfs:8080/tfs/defaultcollection"); 
var connection = new VssConnection(uri, new VssClientCredentials()); 
var client = connection.GetClient<BuildHttpClient>(); 

var builds = await client.GetBuildsAsync(
    project: "OurProject", 
    maxBuildsPerDefinition: 1, 
    type: DefinitionType.Build); 

но последнее утверждение бросает NullReferenceException где-то глубоко в клиентской библиотеке (полный стек трассировки в нижней части).

Я попробовал следующее, и она работает, но, конечно, он не получает мне информацию, я ищу :)

var client = connection.GetClient<WorkItemTrackingHttpClient>(); 
var workItems = await client.GetWorkItemsAsync(ids: new List<int> { 7000, 7005}); 

Am I принципиально недоразумение что-то о том, как запрашивать для сборки? Как избежать этого исключения?


Обновление: Это не только я!

Я только что обнаружил, что эта ошибка не генерируется (только) на стороне клиента; это на стороне сервера (тоже)! GET запрос на следующий адрес:

http://tfs:8080/tfs/defaultCollection/OurProject/_apis/build/builds?api-version=2.0&maxBuildsPerDefinition=1&type=build 

дает 500 Internal Server Error ответ следующего содержания:

{ 
    "$id": "1", 
    "innerException": null, 
    "message": "Object reference not set to an instance of an object.", 
    "typeName": "System.NullReferenceException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 
    "typeKey": "NullReferenceException", 
    "errorCode": 0, 
    "eventId": 0 
} 

Учитывая это, как я должен устранить неисправность? Что я должен спросить/рассказать людям, которые работают на нашем сервере TFS? Что мы ищем?


Стек трассировки для (на стороне клиента) Исключение:

Unhandled Exception: System.AggregateException: One or more errors occurred. 
---> Microsoft.VisualStudio.Services.WebApi.VssServiceResponseException: Object reference not set to an instance of an object. 
---> System.NullReferenceException: Object reference not set to an instance of an object. 
    --- End of inner exception stack trace --- 
    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.HandleResponse(HttpResponseMessage response) 
    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.SendAsync>d__49.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__47`1.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.SendAsync>d__53`1.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__52`1.MoveNext() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 
    at System.Threading.Tasks.Task`1.get_Result() 
    at ConsoleApplication1.Program.Work() in c:\users\tly01\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 32 
    at ConsoleApplication1.Program.Main(String[] args) in c:\users\tly01\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 20 
+0

Вы запрашиваете сборку XAML или сборки на основе задач? –

+0

@ DanielMann: Task-based (другой член перечисления I pass - 'DefinitionType.Xaml'). –

+0

@ DanielMann: Я только что обнаружил, что эта ошибка вызвана на стороне сервера (или, по крайней мере, там тоже ...). Любая идея, что может быть проблемой? –

ответ

0

Я нашел ошибку. Короткий ответ, RTFM :)

Оказывается, что параметр maxBuildsPerDefinition действителен только в том случае, если также указан definitions. Если только первый задан, сервер возвращает 500.

(Вы можете возразить, что 401 Bad Request был бы лучший ответ, но, по крайней мере, теперь я знаю, что с этим делать.)

Мой обходной путь должен был делать фильтрацию на стороне клиента; Я получаю все сборки всех проектов, затем группирую по определению и выбираю последний:

var builds = await client 
    .GetBuildsAsync(
     project: "OurProject", 
     type: DefinitionType.Build).Result 
    .GroupBy(build => build.Definition.Id) 
    .Select(g => g 
     .OrderByDescending(build.FinishTime ?? build.StartTime ?? DateTime.MinValue) 
     .First());