using System.Collections.Generic;
using System.Net.Http.Headers;
using System.Threading.Tasks;
public static async Task Main()
var helper = new AzureLogHelper();
string result = await helper.GetWorkItems(1);
var json = JsonConvert.DeserializeObject<dynamic>(result);
Console.WriteLine("Total Items: " + json.count);
dynamic[] backlogsArray = json.value.ToObject<dynamic[]>();
foreach(dynamic backlog in backlogsArray)
Console.WriteLine(backlog["id"]);
Console.WriteLine(backlog.rev);
Console.WriteLine(backlog["fields"]["System.Title"]);
Console.WriteLine(backlog["fields"]["System.Reason"]);
Console.WriteLine(backlog["fields"]["System.State"]);
Console.WriteLine(backlog["fields"]["System.AreaPath"]);
Console.WriteLine(backlog["fields"]["System.WorkItemType"]);
Console.WriteLine(backlog["fields"]["System.CreatedDate"]);
Console.WriteLine(backlog["fields"]["System.AssignedTo"]["displayName"]);
Console.WriteLine("======================");
public class AzureLogHelper
static string organization = "org-name";
static string project = "project-name";
static string team = "project-team";
static string endpointUrl = $"https://dev.azure.com/{organization}/{project}/{team}/_apis/wit/wiql?api-version=6.0";
static string dataEndpointUrl = $"https://dev.azure.com/{organization}/{project}/_apis/wit/workitemsbatch?api-version=6.0";
static string tokenString = "token-string";
static int MaxItemsPerPage { get; set; } = 200;
public async Task<string> GetWorkItems(int page = 1)
var workItemIds = await GetItemsIDs(page);
if(workItemIds.Length == 0) return string.Empty;
string ApiEndpoint = Uri.EscapeUriString(dataEndpointUrl);
string ApiToken = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", tokenString)));
var payload = JsonConvert.SerializeObject(new { ids = workItemIds });
HttpContent requestContent = new StringContent(payload, Encoding.UTF8, "application/json");
requestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Add("Authorization", $"Basic {ApiToken}");
var response = await httpClient.PostAsync(ApiEndpoint, requestContent);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
public async Task<int[]> GetItemsIDs(int page)
string ApiEndpoint = Uri.EscapeUriString(endpointUrl);
string ApiToken = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", tokenString)));
string queryString = "Select [System.Id] From WorkItems";
var payload = JsonConvert.SerializeObject(new { query = queryString, queryType = "flat" });
HttpContent requestContent = new StringContent(payload, Encoding.UTF8, "application/json");
requestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Add("Authorization", $"Basic {ApiToken}");
var response = await httpClient.PostAsync(ApiEndpoint, requestContent);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
dynamic[] items = JsonConvert.DeserializeObject<dynamic>(result).workItems.ToObject<dynamic[]>();
int startIndex = (page - 1) * MaxItemsPerPage;
int stopIndex = startIndex + MaxItemsPerPage;
List<int> WorkItemIds = new();
if (startIndex >= items.Length || items.Length == 0)
if (stopIndex > items.Length)
stopIndex = items.Length;
for (int i = startIndex; i < stopIndex; i++)
WorkItemIds.Add(Convert.ToInt32(items[i].id));
return WorkItemIds.ToArray();