Пример Webapi для запуска сервисов отдыха TFS и отправки HTTP-вызовов

Я работаю над требованием, т.е. когда ошибка создается/происходит в TFS, отправьте HTTP-вызов в Slack (сторонний инструмент для совместной работы).

Когда ошибка будет устранена, опубликуйте еще один HTTP-вызов в Slack.

Я реализовал плагин на стороне сервера TFS, к сожалению, у нас нет полного доступа к TFS и мы не можем реализовать. Таким образом, планируя внедрить Webapi и разместить его (скажем, в контейнере Docker), и всякий раз, когда в TFS происходит событие создания/закрытия ошибки, он должен отправлять HTTP-вызов.

Я создал простое консольное приложение с методом, и оно работает нормально.

  1. любой пример кода или мысли, чтобы преобразовать его в веб-API?
  2. если я размещаю, может ли он отслеживать события TFS и отправлять некоторые HTTP-вызовы?
public class GetWI
{

static void Main(string[] args)
{
    GetWI ex = new GetWI();
    ex.GetWorkItemsByWiql();
}
public void GetWorkItemsByWiql()
{
    string _personalAccessToken = "xxxx";
    string _credentials = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", _personalAccessToken)));

    //this is needed because we want to create a project scoped query
    string project = "Agileportfolio";

    //create wiql object
    var wiql = new
    {
        query = "Select [State], [Title] " +
                "From WorkItems " +
                "Where [Work Item Type] = 'Bug' " +
                "And [System.TeamProject] = '" + project + "' " +
                "And [System.State] = 'New' " +
                "Order By [State] Asc, [Changed Date] Desc"
    };

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("https://test.visualstudio.com");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", _credentials);

        //serialize the wiql object into a json string   
        var postValue = new StringContent(JsonConvert.SerializeObject(wiql), Encoding.UTF8, "application/json"); //mediaType needs to be application/json for a post call

        var method = new HttpMethod("POST");
        var httpRequestMessage = new HttpRequestMessage(method, "https://abrahamdhanyaraj.visualstudio.com/_apis/wit/wiql?api-version=2.2") { Content = postValue };
        var httpResponseMessage = client.SendAsync(httpRequestMessage).Result;

        if (httpResponseMessage.IsSuccessStatusCode)
        {
            WorkItemQueryResult workItemQueryResult = httpResponseMessage.Content.ReadAsAsync<WorkItemQueryResult>().Result;

            //now that we have a bunch of work items, build a list of id's so we can get details
            var builder = new System.Text.StringBuilder();
            foreach (var item in workItemQueryResult.WorkItems)
            {
                builder.Append(item.Id.ToString()).Append(",");
            }

            //clean up string of id's
            string ids = builder.ToString().TrimEnd(new char[] { ',' });

            HttpResponseMessage getWorkItemsHttpResponse = client.GetAsync("_apis/wit/workitems?ids=" + ids + "&fields=System.Id,System.Title,System.State&asOf=" + workItemQueryResult.AsOf + "&api-version=2.2").Result;

            if (getWorkItemsHttpResponse.IsSuccessStatusCode)
            {
                var result = getWorkItemsHttpResponse.Content.ReadAsStringAsync().Result;
                //Read title 

            }
           
         }

        // Create Channel
        string name = "xyzz3";

        var payload = new
        {
            token = "xoxp-291239704800-292962676087-297314229698-a80e720d98e443c8afb0c4cb2c09e745",
            name = "xyzz3",
        };
        var serializedPayload = JsonConvert.SerializeObject(payload);
        var response = client.PostAsync("https://slack.com/api/channels.create" + "?token=test&name=" + name + "&pretty=1",
        new StringContent(serializedPayload, Encoding.UTF8, "application/json")).Result;
        if (response.IsSuccessStatusCode)
        {
            dynamic content = JsonConvert.DeserializeObject(
                response.Content.ReadAsStringAsync()
                .Result);
        }
            
        }

  }

person user2153844    schedule 21.01.2018    source источник
comment
Вы решили проблему, ответив ниже? Любое обновление? Как упомянул Воутер, WebHook должен быть доступен для вас. Кстати, если ответ решил проблему, вы можете принять его как ответ, это может быть полезно для других членов сообщества, читающих эту тему.   -  person Andy Li-MSFT    schedule 02.02.2018


Ответы (2)


Я использую службу wcf для прослушивания событий из TFS. Вы можете найти мой проект здесь: https://github.com/ashamrai/tfevents

Для службы wcf:

  1. Обновите файл ServiceName.svc и добавьте:

Factory="System.ServiceModel.Activation.WebServiceHostFactory"

  1. Создайте веб-метод для использования json:

[Контракт операции]

[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]

недействительным WorkItemChangedEvent (данные события потока);

  1. Преобразование потока с помощью Newtonsoft.Json для получения информации о событии и рабочем элементе:
    #P7#

строка _eventStr = _reader.ReadToEnd();

WorkItemEventCore _wieventcorre = JsonConvert.DeserializeObject(_eventStr);

Затем вам нужно создать подписку с URL-адресом "http://host:port/service.svc/webmethod": https://docs.microsoft.com/en-us/vsts/service-hooks/services/webhooks

person Shamrai Aleksander    schedule 21.01.2018
comment
Благодаря тонну ! :) - person user2153844; 25.01.2018

Вместо использования запроса и ручного опроса Visual Studio Team Services (VSTS) вы можете использовать концепцию под названием WebHooks. Вы настраиваете WebHook в VSTS для прослушивания событий. и отправьте их на общедоступную конечную точку. Один тип события предназначен для рабочих элементов. Конечной точкой может быть общедоступная конечная точка любого типа, например, Функция Azure.

Если единственное, что вы хотите сделать, это опубликовать события в Slack, это еще проще, потому что это стандартная точка интеграции: Slack с VSTS.

Это намного проще, чем использовать плагин на стороне сервера или писать собственный веб-API.

person Wouter de Kort♦    schedule 22.01.2018