Добрый день. Подскажите пожалуйста как добавить данные, которые пришли по webhook, в таблицу чтоб запись обработалась по событию?
Сейчас добавляется таким образом
[OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] public string GetContactIdByName(string name, string description, string authKey){ // Указывается пользователь, от имени которого выполняется обработка данного http запроса. SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser); var result = ""; if (authKey=="aaa"){ Insert ins = new Insert(SystemUserConnection) .Into("TestWebHook") .Set("Name", Column.Parameter(name)) .Set("Description", Column.Parameter(description)); ins.Execute(); result ="OK"; } else { result ="Wrong request"; } return result; }
соответственно события при этом не отрабатывают.
Нравится
Добрый день, Олег.
Чтобы запись обработалась по событию необходимо сохранять и добавлять ее с помощью EntitySchemaQuery методом Save. Более детально о EntitySchemaQuery:
https://academy.terrasoft.ru/docs/7-16/developer/back-end_development/o…
Более детально как добавить данные:
https://community.terrasoft.ru/questions/c-dobavlenie-dannykh-entitysch…
Oleg,
Примерно так. Создаем новое обращение. И если оно сохранилось, то возвращаем его номер
EntitySchema caseSchema = SystemUserConnection.EntitySchemaManager.GetInstanceByName("Case"); Entity NewCase = caseSchema.CreateEntity(SystemUserConnection); NewCase.SetDefColumnValues(); NewCase.SetDefColumnValue("GroupId", new Guid("85371334-00c8-4098-aafd-c94bd61ff492")); NewCase.SetDefColumnValue("OriginId", new Guid("90110585-0a4a-4b8b-8c05-7cba2e00e664")); NewCase.SetDefColumnValue("Subject", Subject); NewCase.SetDefColumnValue("OwnerId", Owner.Id); NewCase.SetDefColumnValue("ContactId", Contact.Id); NewCase.SetDefColumnValue("Symptoms", Symptoms); NewCase.SetDefColumnValue("RegisteredOn", RegisteredOnDate); NewCase.SetDefColumnValue("RespondedOn", RegisteredOnDate.AddMinutes(15)); NewCase.SetDefColumnValue("FirstSolutionProvidedOn", SolutionProvidedDate); NewCase.SetDefColumnValue("ResponseDate", RegisteredOnDate.AddMinutes(15)); NewCase.SetDefColumnValue("SolutionDate", SolutionProvidedDate); NewCase.SetDefColumnValue("SolutionProvidedOn", SolutionProvidedDate); NewCase.SetDefColumnValue("StatusId" , Core.Configuration.SysSettings.GetValue<Guid>(SystemUserConnection, "UsrCaseStatus", new Guid("3e7f420c-f46b-1410-fc9a-0050ba5d6c38"))); NewCase.SetDefColumnValue("AccountId", Contact.Account); NewCase.SetDefColumnValue("CategoryId", Core.Configuration.SysSettings.GetValue<Guid>(SystemUserConnection, "DefaultCaseCategory", Guid.Empty)); NewCase.SetDefColumnValue("ClosureCodeId", Core.Configuration.SysSettings.GetValue<Guid>(SystemUserConnection, "CaseClosureCodeDef", Guid.Empty)); NewCase.SetDefColumnValue("ClosureDate", DateTime.UtcNow); NewCase.SetDefColumnValue("ServiceItemId", ServiceCodeId); if (NewCase.Save()) { result = string.Format(new LocalizableString(ResourceStorage, "UsrService", "LocalizableStrings.SuccessfulCase.Value"), NewCase.GetTypedColumnValue<string>("Number")); } return result;
Алексей Следь,
Делаю так
[OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] public string AddtoTable(string name, string description, string authKey){ // Указывается пользователь, от имени которого выполняется обработка данного http запроса. SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser); var result = ""; EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrTestWebHook"); Entity entity = schema.CreateEntity(SystemUserConnection); entity.SetDefColumnValues(); entity.SetColumnValue("Name", "ssssssss"); entity.Save(); result ="OK"; return result; }
Отправляю данные на webHook
Получаю ошибку
<div id="content"> <p class="heading1">Request Error</p> <p>The server encountered an error processing the request. The exception message is 'Object reference not set to an instance of an object.'. See server logs for more details. The exception stack trace is: </p> <p> at Terrasoft.Configuration.UsrCustomConfigurationService.UsrCustomConfigurationService.AddtoTable(String name, String description, String authKey) at SyncInvokeAddtoTable(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)</p> </div>
Oleg,
Вопрос 1, а вы SystemUserConnection объявляли?
protected UserConnection SystemUserConnection { get { return UserConnection.AppConnection.SystemUserConnection; } }
Вопрос 2. Логи читали на сервере? что в Error.log пишет?
Алексей Следь,
1. Добавлено
2. В логах
Terrasoft.Web.Common.ServiceModel.ErrorHandler HandleError - AssemblyQualifiedServiceName = [Terrasoft.Configuration.UsrCustomConfigurationService.UsrCustomConfigurationService, Terrasoft.Configuration, Version=7.18.4.1532, Culture=neutral, PublicKeyToken=null] System.NullReferenceException: Object reference not set to an instance of an object. at Terrasoft.Configuration.UsrCustomConfigurationService.UsrCustomConfigurationService.get_SystemUserConnection() at Terrasoft.Configuration.UsrCustomConfigurationService.UsrCustomConfigurationService.AddtoTable(String name, String description, String authKey) at SyncInvokeAddtoTable(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
Листинг
// Пользовательское пространство имен. namespace Terrasoft.Configuration.UsrCustomConfigurationService { using System; using System.ServiceModel; using System.ServiceModel.Web; using System.ServiceModel.Activation; using Terrasoft.Core; using Terrasoft.Web.Common; using Terrasoft.Core.Entities; using Terrasoft.Core.DB; using System.Runtime.Serialization; // Добавлено [ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class UsrCustomConfigurationService: BaseService { // Ссылка на экземпляр UserConnection, требуемый для обращения к базе данных. private SystemUserConnection _systemUserConnection; private SystemUserConnection SystemUserConnection { get { return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection); } } [OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] public string AddtoTable(string name, string description, string authKey){ // Указывается пользователь, от имени которого выполняется обработка данного http запроса. SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser); var result = ""; EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrTestWebHook"); Entity entity = schema.CreateEntity(SystemUserConnection); entity.SetDefColumnValues(); entity.SetColumnValue("Name", "ssssssss"); entity.Save(); result ="OK"; return result; } } }
Если в коде изменить процесс добавления записи в таблицу на способ через INSERT, то всё отрабатывает.
Версия BPM 7.18