Всех приветствую!

Делаю веб-сервис. Методы Post и Get работаю без проблем. А вот с Put и Delete проблема.

Сразу была ошибка:

Изображение удалено. ее победил изменив web.config как описано в статье. Но после этого появилась новая:

Изображение удалено.

Подскажите что делать?

На всякий случай веб-сервис:

[OperationContract]
        [WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json, UriTemplate = "/contact")]
        public void Delete(string deleteData)
        {
            var delete = new Delete(UserConnection)
                .From("Contact")
                .Where("Id").IsEqual(Column.Parameter(deleteData));
            delete.Execute();
        }
 
        [OperationContract]
        [WebInvoke(Method = "PUT", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json, UriTemplate = "/contact")]
        public void Put(string data)
        {
            var update = new Update(UserConnection, "Contact")
                .Set("Name", Column.Parameter("Bla-bla-bla"))
                .Where("Id").IsEqual(Column.Parameter(data));
            update.Execute();
        }

 

Нравится

3 комментария

Добрый день!

Попробуйте использовать эти методы, будут ли они у вас работать?

[OperationContract]
		[WebInvoke(Method = "PUT", UriTemplate = "TestPut/{testId}", RequestFormat = WebMessageFormat.Json,
			ResponseFormat = WebMessageFormat.Json)]
		public string TestPut(string testId) {
			return UserConnection.CurrentUser.Name +  " TestPUT";
		}
 
		[OperationContract]
		[WebInvoke(Method = "DELETE", UriTemplate = "TestDelete/{testId}", RequestFormat = WebMessageFormat.Json,
			ResponseFormat = WebMessageFormat.Json)]
		public string TestDelete(string testId) {
			return UserConnection.CurrentUser.Name + " TestDELETE";
		}
	}
}

 

Дима Вовченко,

Спасибо за ответ!

К сожалению не помогло.

Pavel Litvinovich,

Хм, вы же обращались к запросам так "TestPut/someId" ?

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

Показать все комментарии

После установки пакета, необходимо запустить сервис написанный на C#.

Может кто в курсе как можно это реализовать?

Нравится

3 комментария

в теории можно попробовать поставить через sql скрипт, который выполниться после установки пакета, задачу - job в scheduler на исполнение бп с нужным тебе кодом c# я бы туда копал.

Добрый день!



Вы можете запустить бизнес процесс по сигналу после установки пакета:





С уважением,

Богдан

Bogdan,

если установка задействует уровень entity

Показать все комментарии

 В кастомном веб-сервисе есть метод создания договора, иногда срабатыват, а иногда нет, и пишет ошибку:

Terrasoft.Core.ProcessRunBySignalException: Ошибка при запуске процесса "Типовой договор", инициируемого событием "начальный сигнал". 



Кто-нибудь сталкивался с этим? Пытался найти процесс такой, но безуспешно.

Нравится

1 комментарий

код метода создания договора можно?

Показать все комментарии

Добрый день!

Требуется получить доступ к веб ресурсу, в котором для авторизации используется хэш-функция в заголовке HTTPS запроса.

Хэш функция формируется с использованием sha256 HMAC алгоритма по байтовой строке, состоящей из  текущего времени + метода запроса (POST, GET) + URI запроса + тела запроса. Значение хэш-функции должно быть записано в  заголовок веб сервиса до его вызова. 

1) Подскажите, как в задании-сценарии получить доступ к URI и телу запроса веб сервиса, чтобы сформировать хэш-функцию? Задание-сценарий вызывается перед вызовом веб сервиса, будут ли в этот момент заполнены параметры запроса веб-сервиса?

2) Второй вариант - полностью делать HTTP запрос из задании-сценарии. Как в этом случае лучше передать тело запроса, которое может иметь вложенную структуру? Тело запроса в задании-сценарии необходимо будет преобразовать в JSON формат.

Нравится

2 комментария

Добрый день!



В момент вызовом Web-сервис его параметры не заполнены, они заполняются после. При реализации описанной логики вы не ограничены возможностями C# можете использовать его классы для отправки запросов.

Алёна Доля,

Спасибо за ответ! 

Идея состояла в том, чтобы настроить и заполнить входные параметры вэб-сервиса средствами Creatio, и затем обратиться к ним, как к объекту (если это возможно), в user task. Затем в 

в user task сформировать Http запрос (PostAsync) с пользовательской подписью в заголовке. Параметры, конечно, можно добавить в самом user task, но было бы удобнее передавать их из настроек вэб-сервиса.

 

 

Показать все комментарии

Добрый день коллеги. Был ли у кого опыт используя стандартный функционал "Веб сервис" передавать вложение из Creatio внешней системе.

Нравится

2 комментария

Добрый день!

Уточните, пожалуйста, с какой проблемой Вы столкнулись?

Требовалось нативно передавать вложения через БП

Показать все комментарии

Добрый день!

 

Подскажите, как добавить записи в коллекцию объектов с атрибутами (Collection of Objects with attributes, ICompositeObjectList) веб-сервиса? Через под-процесс не подходит - из таблицы, по которой запускается под-процесс, необходимо добавить не все записи, условие отбора находится в связанной таблице.

Пробовал добавлять через CompositeObjectList как описано тут

CompositeObjectList<CompositeObject> objList = new CompositeObjectList<CompositeObject>();
objList.Add(new CompositeObject (new Dictionary<string, object>() {{"SubParamName",  "SubParamValue1"}}));
return true;

- компилятор ругается на защищенный CompositeObject:  

Изображение удалено.

Нравится

2 комментария

Добрый день.



К сожалению, в системе нет возможности передавать в качестве параметра для веб сервиса коллекцию объектов с атрибутами. 



Варианты решения задачи:

1) Передавать объекты в качестве строки, потом парсить.

2) Обновится на версию 7.16.4. В ней добавлена возможность создавать и настраивать параметр БП типа "Коллекция записей", передавать в веб сервис.  

Mykhailo Storozhuk,

Спасибо за информацию!

Показать все комментарии

Коллеги, Добрый день, 

 

Пытаемся авторизоваться в демонстрационной версии одного веб-сервиса (Lamoda Fulfilment) из интерфейса Creatio OAUTH 2.0

 

При попытке авторизации в веб-сервисе получаем ошибку

Invalid grant_type parameter or parameter missing



При этом "собранный" запрос с передачей в GET необходимых тех же самых параметров client_id, client_secret и grant_type (даже с redirect_url) в адресной строке и как отдельный метод Creatio возвращает ответ без ошибок.



Дополнительные разрешения / scopes для пользователей веб-сервиса не требуются (это demo версия веб-сервиса, условия самые "лайтовые")

 

В связи с этим вопрос?

Кто-нибудь сталкивался с подобной проблемой и с чем может быть связано ?Изображение удалено.



Спасибо всем ответившим Изображение удалено.

Нравится

1 комментарий

Александр, здравствуйте.

 

На данный момент такие типы авторизации OAuth 2.0 не поддерживаются. Так как в запрос не добавляется параметр grant_type.

Показать все комментарии

Коллеги, Добрый день,



Возможно, кто-нибудь сталкивался с задачей: вывести список доступных для доставки улиц населенного пункта (или как вариант-пунктов самовывоза) при заполнении данных в заказе?



Список улиц / пунктов самовывоза получаем при помощи метода веб-сервиса службы доставки.



Вопрос, каким образом в Sales Creatio можно выполнить обращение к веб-сервису и получить данные для вывода в открывающемся списке в процессе заполнения данных заказа?



Пример интерфейса, возвращающего список улиц или пунктов самовывоза в зависимости от выбранного населенного пункта и способа доставки:

Изображение удалено.





Спасибо всем ответившим Изображение удалено.

Нравится

2 комментария
Лучший ответ

1) Сделать общение в веб-сервис при изменении ключевых полей. В ответе, допустим, возвращается список улиц.

2) Делаем виртуальное enum-поле "Улица". Список формируем "на лету" используя то, что вернул сервис. Пример кода тут (в controlConfig нужен prepareList и list)

1) Сделать общение в веб-сервис при изменении ключевых полей. В ответе, допустим, возвращается список улиц.

2) Делаем виртуальное enum-поле "Улица". Список формируем "на лету" используя то, что вернул сервис. Пример кода тут (в controlConfig нужен prepareList и list)

Большое спасибо за ответ, разобрались с возможной реализацией.

Показать все комментарии

Возникла проблема с вызовом веб-сервиса из студии.  Возвращает ошибку 404. Пример сервиса:

 namespace Terrasoft.Configuration
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Core.DB;
    using Terrasoft.Web.Common;
 
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UpsertContactService : BaseService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string GetTransformValue(string inputParam)
        {
            // Изменение значения входящего параметра.
            var result = inputParam + " changed!";
            return result;
        }
    }
}

Пример вызова:

HttpWebResponse authresponse = (HttpWebResponse)authRequest.GetResponse();
            var myRequest = HttpWebRequest.Create("https://мой сайт/0/ServiceModel/UpsertContactService.svc/GetTransformValue") as HttpWebRequest;
 
            myRequest.Method = "POST";
            myRequest.ContentType = "application/json";
            foreach (Cookie Cook in authresponse.Cookies)
            {
                myRequest.Headers.Add(Cook.Name, Cook.Value);
            }
            myRequest.CookieContainer = bpmCookieContainer;
 
            using (var requestStream = myRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requestStream))
                {
                    writer.Write(@"111");
                }
            }
            using (HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse())
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                {
                    string s = reader.ReadToEnd();
                    Console.WriteLine(s);
                }
            }

Авторизация проходит успешно, БП получилось запустить. Как запустить сервис и получить от него ответ?

Нравится

4 комментария
Лучший ответ

Добрый день

Виталий, в статье на академии есть ответ https://academy.terrasoft.ru/docs/developer/back-end_development/config…

 

Ответ 404 верный, т.к. у вас нет такого сервиса. Вы создаете конфигурационный сервис, который вызывается по другому url.

 

А зачем в Header добавлять значения всех кук из аутентификации? Достаточно только BPMCSRF.

Во-вторых. Вызов под каким пользователем происходит? под портальным? Если да, то надо сервис добавить в список разрешенных для портальных - \папка приложения\Terrasoft.WebApp\SspServices\SspServiceList.txt

Добавить комментарий

Алексей Следь,

происходит под админом, сайт в облаке, через постмен тоже 404.

Вот что в браузере пишет:

Добрый день

Виталий, в статье на академии есть ответ https://academy.terrasoft.ru/docs/developer/back-end_development/config…

 

Ответ 404 верный, т.к. у вас нет такого сервиса. Вы создаете конфигурационный сервис, который вызывается по другому url.

 

Артем Гура,

Да! То что нужно! Вот рабочий код:

HttpWebResponse authresponse = (HttpWebResponse)authRequest.GetResponse();
            var myRequest = HttpWebRequest.Create("https://mysite.com/0/rest/UpsertContactService/GetTransformValue") as HttpWebRequest;
 
            myRequest.Method = "POST";
            myRequest.ContentType = "application/json";
            myRequest.Headers.Add(authresponse.Cookies["BPMCSRF"].Name, authresponse.Cookies["BPMCSRF"].Value);
            myRequest.CookieContainer = bpmCookieContainer;
 
            using (var requestStream = myRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requestStream))
                {
                    writer.Write(@"{""inputParam"":""Test!""}");
                }
            }
            using (HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse())
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                {
                    string s = reader.ReadToEnd();
                    Console.WriteLine(s);
                }
            }

И еще как авторизовался, может кому нужно будет:

var authRequest = HttpWebRequest.Create(@"https://mysite.com/ServiceModel/AuthService.svc/Login") as HttpWebRequest;
            authRequest.Method = "POST";
            authRequest.ContentType = "application/json";
            var bpmCookieContainer = new CookieContainer();
            authRequest.CookieContainer = bpmCookieContainer;
            using (var requestStream = authRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requestStream))
                {
                    writer.Write(@"{
                                ""UserName"":""Supervisor"",
                                ""UserPassword"":""Supervisor"",
                                ""SolutionName"":""TSBpm"",
                                ""TimeZoneOffset"":-120,
                                ""Language"":""Ru-ru""
                                }");
                }
            }

 

Показать все комментарии

Всем привет!

 

Учусь писать веб-сервисы. Накидал вот такой простенький веб-сервис:

 

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class UserController : BaseService
{
        [OperationContract]
        [WebInvoke(Method="POST",RequestFormat=WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json)]
        public string DataGet(WarehouseInfo hh)
        {
            return hh == null ? "Хватит!" : hh.Name;
        }

        [DataContract]
        public class WarehouseInfo
        {
            [DataMember(Name = "складGuid")]
            public string Id { get; set; }

            [DataMember(Name = "пометкаУдаления")]
            public string isDelete { get; set; }

            [DataMember(Name = "наименование")]
            public string Name { get; set; }
        }
}

 

Как бы я не пыхтел с Постманом, но WarehouseInfo всегда прилетает пустой. Что я делаю не так?

Нравится

4 комментария

пример своего запроса можно(с телом урлом и хедерами), а ключ csrf указывали в хедерах, куки перед отправкой чистили, точно ли отправляете пост запрос , а не гет?

namespace Terrasoft.Configuration
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Core.DB;
    using Terrasoft.Web.Common;
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class ClassName : BaseService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
            RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public void MethodName(входные параметры)
        {
             // логика веб-сервиса
        }
    }
}

Кусок рабочего веб-сервиса.

ты только подтвердил что не видишь его ошибку. У него ошибка в ссылочном типе, где у тебя обобщение "входные параметры". 

Отвечу на всякий случай. Возможно автор темы слал запрос вида:

{
 "Id ": "123",
 "isDelete" : "123",
 "Name": "123"
}



Хотя в данном случае требуется запрос вида:

{
 "hh": {
  "Id ": "123",
  "isDelete" : "123",
  "Name": "123"
 }
}

Все дело в: "BodyStyle=WebMessageBodyStyle.Wrapped".


 
Показать все комментарии