пятница, 18 октября 2013 г.

Старт K2 workflow (процесса) c помощью REST-сервиса

Существует довольно большое количество вариантов запуска K2 workflow, это и традиционный старт процессов из клиентских форм (интерфейсов) - ASP.NET формы (Web и Windows), формы Microsoft InfoPath, SharePoint web-части, интерфейсы K2 smartforms и т.д. Кроме того, процессы могут запускаться по расписанию, по событию в других системах (например, публикация документа в библиотеку документов SharePoint или удаление элемента списка), по событию выполнения любого метода любого K2 смартобъекта, через триггеры, event-listener'ы и так далее.

Приводимый ниже пример позволяет запустить K2 workflow посредством вызова REST-сервиса:



public HttpClientHandler GetCredentials()
        {
            HttpClientHandler handler = new HttpClientHandler();

            if (AuthType == Data.AuthType.NTLM)
            {
                handler.Credentials = new NetworkCredential(K2User, K2Password, K2Domain);
            }
            if (AuthType == Data.AuthType.Basic)
            {
                handler.Credentials = new NetworkCredential(String.Format("{0}\\{1}", K2Domain, K2User), K2Password);
            }

            return handler;
        }

      

        public async Task StartProcessInstance(string processName, string expectedDuration, string priority, string folio, List<DataFieldSendPacket> fields, bool sync)
        {

            //Build up xml packet to send to rest service
            string processXML = GenerateProcessXML(processName, expectedDuration, priority, folio, fields);

            // post to task service
            HttpResponseMessage response;
            using (HttpClientHandler handler = this.GetCredentials())
            {
                using (HttpClient client = new HttpClient(handler))
                {
                    string resourceAddress = "Process/Instances/StartInstance";
                    client.BaseAddress = new Uri(BaseK2Uri + "REST.svc/");
                    if (sync)
                    {
                        resourceAddress = "Process/Instances/StartInstance?synchronous=true";
                    }

                    response = await client.PostAsync(resourceAddress, new StringContent(processXML, Encoding.UTF8, "text/xml"));

                    if (!response.IsSuccessStatusCode)
                    {
                        //call failed, manage it
                        throw new Exception(response.StatusCode.ToString());
                    }
                }
            }

        }

        private string GenerateProcessXML(string processName, string expectedDuration, string priority, string folio, List<DataFieldSendPacket> fields)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(@"<?xml version='1.0' encoding='utf-8'?><w:ProcessInstance xmlns:w='http://schemas.k2.com/worklist/d1' xmlns:p='http://schemas.k2.com/process/d1'");
            sb.Append(" ExpectedDuration='" + expectedDuration + "'");
            sb.Append(" FullName='" + processName + "'");
            sb.Append(" Folio='" + folio + "'");
            sb.Append(" Priority='" + priority + "'>");

            foreach (var field in fields)
            {
                sb.Append("<p:DataField Name='");
                sb.Append(field.Name);
                sb.Append("'>");
                sb.Append(field.Value);
                sb.Append("</p:DataField>");
            }

            sb.Append("</w:ProcessInstance>");
            return sb.ToString();

        }

Комментариев нет:

Отправить комментарий