Всем привет!

 

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

 

[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".


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

Добрый день! Появилась необходимость создать бизнес процессы через POST-запросы. 

Используя мануал для DataServise , написал кейс такого вида: 

 

 data = {
    "columnValues": {
        "items": {
            "Account": {
                "expressionType": 2,
                "parameter": {
                    "dataValueType": 10,
                    "value": "f3f8f781-3c5b-4ecb-89ef-5c1ed4da12ga"
                },
            },
 
            "Category": {
                "expressionType": 2,
                "parameter": {
                    "dataValueType": 10,
                    "value": "1c0bc159-150a-e111-a31b-f2g4hd04c01d"
                },
            },
....
            "operationType": 1,
            "rootSchemaName": "Case"
     },
    },
}

Но при post запросе вида: 

 

h = requests.post("
https://bpm-test.ru/0/dataservice/json/Reply/InsertQuery
", headers=headers, cookies=p.cookies, data=json.dumps(data))

Появляется ошибка :



 

{'responseStatus': {'ErrorCode': 'ArgumentNullOrEmptyException', 'Message': 'Значение аргумента "name" не может быть пустым', 'Errors': []}, 'rowsAffected': -1, 'nextPrcElReady': False, 'success': False}

С чем это может быть связано? если поле name даже не присутствует 

Нравится

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

Дмитрий, уточните, Вы спрашиваете о запуске процесса или о создании записи в каком-то разделе (в Вашем примере — Case)?

Если интересует именно первое, нужно использовать не DataService, а ProcessEngineService. Как его запускать в POST, см. тему.

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

Пытаюсь обратиться к сервису http://.../0/rest/ITdsBSC/CaseBSC методом POST, предварительно получил в GET cookies и явно передавал params, в т.ч. utf-8, но возвращается в неизвестной кодировке 403 ошибка, как через postman правильно посылать POST запросы? Делал по гайду с академии, какие могут быть идеи в чем проблема? P.S. url очистил т.к. NDA

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

Нравится

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

Если сервис не анонимный, то не прошли аутентификацию. Надо сначала вызвать авторизоваться через метод http://.../ServiceModel/AuthService.svc/Login получить куки и в заголовке своего запроса передать значение BPMCSRF

Если сервис не анонимный, то не прошли аутентификацию. Надо сначала вызвать авторизоваться через метод http://.../ServiceModel/AuthService.svc/Login получить куки и в заголовке своего запроса передать значение BPMCSRF

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

Добрый день.

Мной разработан конфигурационный веб-сервис

 

[ServiceContract]
   [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
   public class ConnectorService : BaseService
   {
      [OperationContract]
      [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
      public bool CreateContact(string firstName, string middleName, string lastName)
      {
...
return true;
}
}



На страницах академии есть материалы о том как вызвать конфигурационный веб-сервис с с помощью Postman или ServiceHelper, но нет информации как его вызвать со страницы другого веб-сайта, например с использованием API XMLHttpRequest.  Функциональность и работоспособность веб-сервиса проверена с помошью Postman. Все работает.

Однако указанный метод  веб-сервиса должен вызываться со страницы стороннего сайта (доступ к которой имеется). 

Подскажите как вызвать конфигурационной веб-сервис Creatio со страницы другого веб-сайта. Желательно с примерами. 

Нравится

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

Андрей, пример использования XMLHttpRequest для POST есть тут, но это наоборот, вызов со страниц 7.Х внешнего сервиса. В обратном направлении должно быть аналогично, но нужно учитывать необходимость авторизации при помощи AuthService и получение всех нужных кук, либо делать его доступным анонимно. Также по поводу возможных ограничений при работе с другого домена и путей их обхода см. темы: 1, 2, 3.

 

Другой вариант — работать с веб-сервисом не из браузера, а из серверного кода другого сайта. Конкретная реализация зависит от языка, на котором он написан: PHP, C#, Java, JS и др.

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

Коллеги, добрый вечер!

Работаю с внешней системой, которая шлет запросы в указанном формате:

curl --location --request POST 'http://localhost/0/ServiceModel/BsoCaller.svc/DoWork' \
--header 'Content-Type: application/xml' \
--data-raw '<?xml version="1.0" encoding="UTF-8"?>
<Event>
</Event>'

Написал анонимный веб-сервис на подобие:

namespace Terrasoft.Configuration.MyNamespace
{
	using System;
	using System.IO;
	using System.Linq;
	using System.Runtime.Serialization;
	using System.Text;
	using System.ServiceModel;
	using System.ServiceModel.Activation;
	using System.ServiceModel.Web;
	using System.Web;
	using System.Xml.XPath;
	using System.Xml.Linq;
	using System.Reflection;
	using Terrasoft.Core;
	using Terrasoft.Common;
	using Terrasoft.Core.Entities;
	using Terrasoft.Web.Common;
 
	[ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class BsoCaller: BaseService 
	{
		[OperationContract]
		[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
		public void DoWork()
		{
			var xml = Encoding.UTF8.GetString(OperationContext.Current.RequestContext.RequestMessage.GetBody<byte[]>());
		}
	}
}

Пробую отправить запрос через postman в виде xml - получаю Bad Request.

Если выбираю Text - запрос отрабатывает.

Кто-нибудь сталкивался? Где допускаю ошибку?

Спасибо!

Нравится

15 комментариев

Добрый день! 

Первое что бросается в глаза это запрос:

curl --location --request POST 'http://localhost/0/ServiceModel/BsoCaller.svc/DoWorkhttp://localhost/0/…'

Это опечатка в данном посте или на самом деле такая адресная строка?

Руслан Хасанов,

Руслан, добрый день.

Это опечатка в данном посте) Поправил.

Я думаю что адресная строка должна быть примерно такой

http://localhost/0/ServiceModel/MyService/Handler

К тому же метод Handler должен возвращать результат работы, чтобы было что то видно.

Руслан Хасанов,

Руслан, извиняюсь. Подправил названия в веб-сервисе, чтобы было понятнее. Писал просто в торопях в кач-ве примера.

Суть в том, что если я оборачиваю тело в постмане в Text - все отрабатывает. С Xml же какая-то беда.

Хорошо, теперь ближе к правде. Не понятно, конечно, почему такое поведение с Text. Ваш метод DoWork ни чего не возвращает (void).  Я думаю что он должен делать:

return "some text result, for example";

а если конкретно в вашем случае, то return xml; 

И сигнатуру метода надо изменить на public string DoWork.....

Руслан Хасанов,

Руслан, дело в том, что в методе на самом деле не одна строка. Просто сюда решил не скидывать весь код, т.к. уже на этапе инициализации переменной xml возникает проблема.

Дальнейшая логика в методе парсит содержимое переменной xml и создается запись в разделе. И все это работает если слать через Text.

Методу не обязательно что-то возвращать. Если переделать под ваш вариант - к сожалению ничего не поменяется. Все тот же Status: 400 Bad Request в постмане.

Подозреваю что проблема в параметрах, что над методом. Но уже по моему все перепробовал.

Александр, а что именно за Bad Request? Там же в ответе должна быть более подробная информация о причине. Если при этом самодельный веб-сервис упал с ошибкой, её стек должен быть в логах сайта.

Зверев Александр,

Александр, вот что пишет:

The server encountered an error processing the request. The exception message is 'Error in line 2 position 145. Expecting element 'base64Binary' from namespace 'http://schemas.microsoft.com/2003/10/Serialization/'.. Encountered 'Element' with name 'Event', namespace 'http://schema.broadsoft.com/xsi'. '. See server logs for more details. The exception stack trace is:
 
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader) at System.ServiceModel.Channels.Message.GetBodyCore[T](XmlDictionaryReader reader, XmlObjectSerializer serializer) at Terrasoft.Configuration.BsoCesolutions.UsrNewCallHandler.WebhookHandler() at SyncInvokeWebhookHandler(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Подаю в постмане такое тело в xml:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xsi:Event xsi1:type="xsi:SubscriptionEvent" xmlns:xsi="http://schema.broadsoft.com/xsi" xmlns:xsi1="http://www.w3.org/2001/XMLSchema-instance"&gt;
    &lt;xsi:eventData xsi1:type="xsi:CallReleasedEvent"&gt;
        &lt;xsi:call&gt;
            &lt;xsi:callId&gt;2222222222222222&lt;/xsi:callId&gt;
            &lt;xsi:extTrackingId&gt;222222222222&lt;/xsi:extTrackingId&gt;
            &lt;xsi:networkCallId&gt;2222222222222222&lt;/xsi:networkCallId&gt;
            &lt;xsi:startTime&gt;2222222222222&lt;/xsi:startTime&gt;
            &lt;xsi:answerTime&gt;22222222222222&lt;/xsi:answerTime&gt;
            &lt;xsi:releaseTime&gt;2222222222222&lt;/xsi:releaseTime&gt;
        &lt;/xsi:call&gt;
    &lt;/xsi:eventData&gt;
&lt;/xsi:Event&gt;

Решил переписать немного метод:

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
public string DoWork()
{	
    using (var reader = OperationContext.Current.RequestContext.RequestMessage.GetReaderAtBodyContents())
    {
        return reader.ReadOuterXml();
    }
}

Теперь ошибки нету, но получаю такое тело в постмане:

&lt;string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"/&gt;

А нужно получить по сути тоже самое, что подал. Просто в виде строки.

Вот аналогичный случай, но, смотрю, Вы совет оттуда уже попробовали. Там ещё советуют приводить сразу к нужному типу класса с такими полями.

 

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

Зверев Александр,

Боюсь привести к нужному типу сразу такой запрос затруднительно.

Еще как выяснилось если писать в базу - строка вообще пустая)

Не сильно теперь понимаю почему постман вообще что-то возвращает.

Пробовал так же пройтись по всем методам из XmlDictionaryReader, но ничего подходящего не нашел.

Александр Горчаков пишет:

Не сильно теперь понимаю почему постман вообще что-то возвращает.

Так это, наверное, пустую строку так сериализировало.

 

 

Зверев Александр,

Да, уже убедился.

Вообщем пока все еще не понятно как нормально отлавливать xml post-запросы в wcf..

Вообще, в системе куча примеров сервисов, но все на Json.

 

А с WebMessageBodyStyle.Bare точно всё правильно? Смотрю тут примеры, Ваш запрос больше на WebMessageBodyStyle.Wrapped похож.

Зверев Александр,

Wrapped пробовал для обоих методов. Результаты аналогичные.

Попробуйте ещё советы из этой темы, в частности, создать сервис для теста сначала не в 7.Х, а в отдельной своей программе и проверить, всё ли нормально в конфиге.

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

Подскажите как можно в C# сделать Serialize в json объект класса

public class ImportCreatioServiceCaseColumns
{
	[JsonPropertyName("idNumber")]
	public string IdNumber { get; set; }
	[JsonPropertyName("typeCase1Name")]
	public string TypeCase0Name { get; set; }
}
public class ImportCreatioProcessCaseColumnsOut
{
	[JsonPropertyName("schemaName")]
	public string BusinessProcessName { get; set; }
	[JsonPropertyName("parameterValues")]
	public ImportCreatioServiceCaseColumns ImportCreatioServiceCaseColumns { get; set; }
 
}

и привести его к виду 

{
	"schemaName":"KtImportCaseTransferTableInBPMTest",
	"parameterValues":
	[
		{"name":"idNumber","value":"80001019"},
		{"name":"typeCase1Name","value":"Алматы"}
	]
}

?

Это нужно что бы передать body в микровервис для запуска бизнес-процесса с параметрами POST методом.

Нравится

5 комментариев

Можно подключитье  Json.NET он уже включен в коробке. Подробнее об использовании смотрите https://www.newtonsoft.com/json

 

Как то так

 

sing System;
using Newtonsoft.Json;
 
namespace JsonPrettyPrint
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Product product = new Product
                {
                    Name = "Apple",
                    Expiry = new DateTime(2008, 12, 28),
                    Price = 3.99M,
                    Sizes = new[] { "Small", "Medium", "Large" }
                };
 
            string json = JsonConvert.SerializeObject(product, Formatting.Indented);
            Console.WriteLine(json);
 
            Product deserializedProduct = JsonConvert.DeserializeObject&lt;Product&gt;(json);
        }
    }
 
    internal class Product
    {
        public String[] Sizes { get; set; }
        public decimal Price { get; set; }
        public DateTime Expiry { get; set; }
        public string Name { get; set; }
    }
}

 

Не работает так как нужен именно такой формат, уже пробовал как Вы советуете 

Григорий Чех пишет:

{"name":"idNumber","value":"80001019"},

Похожий формат обсуждают тут.

 

Зверев Александр пишет:

Похожий формат обсуждают тут.

А Вы пробовали вызывать бизнес-процесс из другого приложения через post вызов передавая параметры через тело запроса? 

Александр, см. тут.

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

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

Изучили ряд тем на сообществе по данному вопросу и попробовали воспроизвести кейс из данной темы:

https://community.terrasoft.ru/questions/anonimnaa-autentifikacia-vnesn…

Сделали всё в точности как описано в примере, включая настройку web-конфигов. 

Сервис:

namespace Terrasoft.Configuration
{
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Data;
 using System.Linq;
 using System.Security;
 using System.ServiceModel;
 using System.ServiceModel.Web;
 using System.ServiceModel.Activation;
 using System.Web;
 using Terrasoft;
 using Terrasoft.Common;
 using Terrasoft.Common.Json;
 using Terrasoft.Core;
 using Terrasoft.Core.DB;
 using Terrasoft.Core.Entities;
 using Terrasoft.Core.Store;
 using Newtonsoft.Json;
 
 using Terrasoft.Web.Common;
 
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrGreetingService : BaseService //,System.Web.SessionState.IReadOnlySessionState
    {
 
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "Hello", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public string TestHello()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
 
        [OperationContract]
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
        public string TestHelloXml()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        public string TestPostJson()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
 
 
 
 //       private UserConnection _userConnection;
  /// <summary>
  /// </summary>
// private UserConnection UserConnection {
//  get {
//   return _userConnection ?? (_userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection);
 //  }
// }
    }
}

 

В результате попробовали отправить запрос через POSTMAN

1) Если указать метод GET без авторизационных Cookie, то всё работает

Как пример можно получить результат запроса по ссылке:

http://93.188.21.108:2022/0/ServiceModel/UsrGreetingService.svc/Hello

 

2) Указываем метод POST без авторизационных Cookie, то получаем 403:

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

 

 

Если же добавить к запросу(метод POST) авторизационные Cookie, то всё работает...

Коллеги, прошу подсказать, что именно делаем не так?

 

Нравится

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

Добрый день, 

Проверьте включена ли на сайте CSRF-защита. В внешнем и внутреннем Web.config есть атрибут UseCsrfToken, содержит значение true то можно поступить следующим образом: 

1. Изменить значение UseCsrfToken в Web.config и WebApp/Web.config на 

&lt;add key="UseCsrfToken" value="false" /&gt;

2. В хедере запроса отправлять Csrf-токен. Следующим образов (в случае безавторизационного сервиса, авторизацитонные куки можно не отправлять):

Tsopa,

Спасибо большое! Решили проблему получением и отправкой

авторизацитонных куков!

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

Добрый день!

Реализую возможность добавить информацию о звонке в BPM через OData.

Что я делаю: POST запрос с Content-Type: application/json;odata=verbose;type=entry на https://phonetcomua.bpmonline.com/0/ServiceModel/EntityDataService.svc/CallCollection

JSON имеет такой вид:

{
    "CalledId": "+380990056970",
    "CallerId": "+380990056960",
    "Duration": 400,
    "TalkTime": 299,
    "Direction": {
          "__metadata":{"uri":"??????"}
    },
    "Contact": {
        "__metadata":{"uri":"ContactCollection(guid'97d39836-b242-462a-b375-9daa32e553e4')"}
    }
   
}

Непонятно как указать URI с guid для Direction и Result свойств.

Я знаю возможные значения guid для enum-a CallDirection, но я не знаю как правильно ссылаться на этот объект при добавлении звонка.

Нравится

9 комментариев

Вопрос снят. Почему то не догадался попробовать CallDirectionCollection.

Почему добавленные через OData звонки не отображаются в разделе Звонки.
Во вкладке История у конктакта краткая информация о звонке отображается.
Если перейти по https://phonetcomua.bpmonline.com/0/Nui/ViewModule.aspx#CardModuleV2/Ca… информация о звонке доступна

"Developer2" написал:Если перейти по https://phonetcomua.bpmonline.com/0/Nui/ViewModule.aspx#CardModuleV2/Cal... информация о звонке доступна

мы как участники сообщества Доступ в базы данных чужих пользователей не имеем. (на доступ мы и ненапрашиваемся :smile: ) Данный доступ есть у вас и я думаю у технической поддержки компании Террасофт. Если у вас есть проблемы, то лучше описывать их более подробно и прикладывать скриншоты.

"Developer2" написал:Почему добавленные через OData звонки не отображаются в разделе Звонки.
Во вкладке История у конктакта краткая информация о звонке отображается.

Сравните записи в базе напрямую, полученную через одата и обычную, разницу и увидите... может типа какого не хватает заполненного
Если ондеманд, поищите тут был sql executer для выполнения запросов

"Александр Кудряшов" написал:Если ондеманд, поищите тут был sql executer для выполнения запросов

Александр подскажи пожалуйста где тут поискать?

"Власов Михаил Викторович" написал:

Александр подскажи пожалуйста где тут поискать?


"sqlexecuterpage" вот тут

"Александр Кудряшов" написал:
Developer2 пишет:

Почему добавленные через OData звонки не отображаются в разделе Звонки.

Во вкладке История у конктакта краткая информация о звонке отображается.

Сравните записи в базе напрямую, полученную через одата и обычную, разницу и увидите... может типа какого не хватает заполненного

Если ондеманд, поищите тут был sql executer для выполнения запросов

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

Разобрался. Все прикреплялось. Я просто на странице не ту вкладку смотрел. Нужно было на Список переключить.

У меня еще один вопрос. На странице https://academy.terrasoft.ua/documents/customer-center/7-8-0/zapis-i-pr… сказано, что можно прослушивать звонки.
Так вот, я пока через интерфейс пробовал добавить ссылку с записью на разговор, она добавляется, но кнопка прослушать не появляется. Возможно какая-то настройка отключена, поскольку в примечании говорится

Возможность прослушать аудиозапись звонка будет доступна при выполнении персональных настроек.

Можете подсказать будет ли работать через ссылку на аудиозапись или это фича только для Oktell и Webitell?

"Developer2" написал:Можете подсказать будет ли работать через ссылку на аудиозапись или это фича только для Oktell и Webitell

Зная как обычно такие модули сделаны, автоматом фича включится именно для официально представляемых интеграций, а если ссылка своя то либо в поддержку, либо живьем анализировать код, где "прослушать запись".
В принципе при наличии ссылки все что нужно это заставить браузер по клику проиграть запись...

"Александр Кудряшов" написал:
Developer2 пишет:

Можете подсказать будет ли работать через ссылку на аудиозапись или это фича только для Oktell и Webitell

Зная как обычно такие модули сделаны, автоматом фича включится именно для официально представляемых интеграций, а если ссылка своя то либо в поддержку, либо живьем анализировать код, где "прослушать запись".

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

При интеграции с Мегапланом именно так и делали. Вставляли ссылку и затем через chrome extension изменяли страницу.

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

Привет.
Есть POST сервис на C#, который принимает и возвращает json.
Появилась идея, чтоб не регистрировать этот сервис в bpmonline запускать его через бизнес процесс.
Все нормально работает, но вот как передать в БП json тело и получить некий json обратно?
Пока удалось только передать параметры в Url.

Нравится

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

Добрый день,
На данный момент в сервисе ProcessEngineService нет такого метода, который бы позволял передавать параметры из тела POST запроса. Есть похожий метод ExecuteProcessWithResultPost но он устанавливает параметры процесса только из URL.

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

Добрый день!

Подскажите, пожалуйста, как в функции SaveChanges, а точнее в BaseDBEdit.Dataset.Post() определяется набор полей которые надо обновить? Почему-то измененное поле сохраняется не всегда...

Заранее благодарен.

Нравится

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

"AlexLS" написал:как...определяется набор полей которые надо обновить

никак. Поля, которые Enabled в датасете, сохраняются в БД. Конечно, если поля корректно настроены и для них нормально формируется элемент в selectQuery. Например, если поле получается подзапросом, его изменения просто так не сохранятся.

см также http://www.community.terrasoft.ru/blogs/8933

ПС.

"AlexLS" написал:Почему-то измененное поле сохраняется не всегда...

когда сохраняется, а когда - нет?
А другие поля сохраняются, когда это не сохраняется?
Проверьте профайлером, идет ли у вас апдейт таблицы в тех случаях, когда не сохраняется.

"AlexLS" написал:Почему-то измененное поле сохраняется не всегда...

Александр, это же подход менеджера, но не разработчика :)
Профайлер в руки и упорным анализом логов познаем закономерность.
Кстати эффект "не сохраняется" может быть из-за криво написанных обработчиков событий на датасете или карточке - типа смены значений полей при изменении других... смены не видно глазами, а она фоном происходит в датасете, ну и при сохранении уже в таблицы попадает

"Андросов Дмитрий" написал:когда сохраняется, а когда - нет?

Дмитрий, спасибо за ответ! Пытаюсь сообразить, но пока понял что при инсерте сохраняется, а пр апдейте нет. Непосредственно перед постом, в

function SaveChanges(BaseDBEdit, Window) {
...
var PostResult = BaseDBEdit.Dataset.Post();
...

, значения следующие:

Dataset.DataFields('PhoneNumber').IsReadOnly = false;
Dataset.DataFields('PhoneNumber').ValueIsChanged = true;
Dataset.DataFields('PhoneNumber').IsEnabled = true;
Dataset.SelectQuery.Columns.ItemsByAlias('PhoneNumber').IsEnabled = true;

Что-то еще забыл указать? (да, сразу после поста значения НЕ изменились!)

"Андросов Дмитрий" написал:Проверьте профайлером, идет ли у вас апдейт таблицы в тех случаях, когда не сохраняется.

остальные поля сохраняются. Профайлер показывает то что и подразумевается, исключая одно несчастное поле, которое, почему-то игнорится при апдейте!

Проверьте в датасете - быть может у вас Updatequery не генерируется автоматом?

"Олейник Дмитрий" написал:Проверьте в датасете - быть может у вас Updatequery не генерируется автоматом?

Наверно тогда бы другие поля не сохранялись? А так обновляются все поля кроме указанного текстового поля. Ну в датасете все прописано нормально.

Добрый день!

Прошу уточнить, какое у Вас состояние датасета перед "постом":

BaseDBEdit.Dataset.State

Также, посмотрите, какой UpdateQuery у Вас генерируется перед изменением значения, а какой - после.
Также, посмотрите запрос в профайлере SQL.

"Безродный Андрей" написал:Прошу уточнить, какое у Вас состояние датасета перед "постом":

Состояние где "надёжнее" проверить? В "OnDatasetBeforePost" датасета или в скрипте карточки в "dlDataOnDatasetBeforePost" (аналогичный вопрос с after)?

"Безродный Андрей" написал:Прошу уточнить, какое у Вас состояние датасета перед "постом":

BaseDBEdit.Dataset.State

В ProcessBaseDBEditOKOnClick -> SaveChangesWithCheck -> SaveChanges

	var PostResult = BaseDBEdit.Dataset.Post();

смотрю:
перед: BaseDBEdit.Dataset.State 2 Number
после: BaseDBEdit.Dataset.State 1 Number

Запрос:

exec sp_executesql N'UPDATE [dbo].[vw_SCall]
	SET [ModifiedOn] = getdate(),
	[ModifiedByID] = ''{9149E4AB-B8E2-491A-A2B1-AA344021DAF8}'',
	[Description] = @P1
WHERE([vw_SCall].[ID] = @P2)',N'@P1 varbinary(8000),@P2 uniqueidentifier',NULL,'835BBD40-EAE4-4139-8466-93A00156C624'

"Безродный Андрей" написал:какой UpdateQuery у Вас генерируется перед изменением значения

BaseDBEdit.Dataset.UpdateQuery.SQLText
UPDATE [dbo].[vw_SCall]
	SET [ModifiedOn] = NULL,
	[ModifiedByID] = NULL
WHERE([vw_SCall].[ID] = :ID)

не смотря на то что:

Dataset.DataFields('PhoneNumber').ValueIsChanged = true
BaseDBEdit.Dataset.DataFields('PhoneNumber').ValueIsChanged = true

Под пользователем ограниченным выполняем изменение? Судя по wv_SCall

Советую посмотреть триггер tr_vw_SCall_IU (где-то так должен называться) на этой вьюшке, который отвечает за update непосредственно таблицы, по результату update вьюхи. Там с этим полем PhoneNumber все в порядке - может пропущено оно где в запросах?

"Александр Кудряшов" написал:посмотреть триггер tr_vw_SCall_IU

посмотрел [dbo].[tr_vw_SCall_IU]
есть строка  [P].[PhoneNumber] = [I].[PhoneNumber],  
у меня мысли были что из-за того что поле где-то принимает  IsReadOnly = true (а я меняю это значение если вставка необходима), может как-то влияет на строящийся запрос вставки, но как это подтвердить не знаю и как поправить тоже не понимаю...

а галочка в selectQuery под названием "Всегда выбирать в запросе" стоит? :cool:

"Андросов Дмитрий" написал:

а галочка в selectQuery под названием "Всегда выбирать в запросе" стоит? :cool:


А зачем она, если поле в SELECT'е выбрано? Или тут тоже есть "секрет"?

Если она не стоит и поле нигде не отображается, оно не попадает в запрос. По аналогии можно предположить (я не знаю как на самом деле), что если поле при создании экземпляра датасета имеет свойство Только на чтение, оно не попадает в автоматически формируемый UpdateQuery. Т.к. UpdateQuery формируется на основе SelectQuery, можно предположить, что эта галочка добавит поле в апдейт, игнорируя признак Только на чтение. Попробуйте)
Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете? Если так, то попробуйте установить его в False, а потом в скрипте менять по необходимости.

А я бы предложил вообще без всяких хитрых изменений попробовать в совершенно отвлеченном месте получить экземпляр этого датасета, отключить ему эвенты и попробовать сделать Open(), Edit(), потом поменять значение поля нужного и Post(). Потом посмотреть все ли поменялось. Если ок, искать причины в том месте, где возникает проблема - карточка, события на датасете и т.д

"Андросов Дмитрий" написал:Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете?

Дмитрий, спасибо! В датасете галка не стоит, а устанавливается в true на OnPrepare, затем на кнопке OK на всякий случай меняю это свойство на false.

"Александр Кудряшов" написал:Потом посмотреть все ли поменялось

Александр, спасибо! Видимо так и придется пробовать!

Итак, если кому-то интересно: :biggrin:

на  OnDatasetBeforeEdit нельзя вешать обновление данных

"AlexLS" написал:на  OnDatasetBeforeEdit нельзя вешать обновление данных

конечно, т.к. это событие которое срабатывает перед переводом датасета в состояние редактирования (Dataset.Edit())

"Андросов Дмитрий" написал:конечно, т.к. это событие которое срабатывает перед переводом датасета в состояние редактирования (Dataset.Edit())

Дмитрий, если б Вы это "конечно" сказали тут было бы круто!!!

"AlexLS" написал:если б

если б вы о OnDatasetBeforeEdit сказали бы раньше, чем тут было бы тоже весьма кстати

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