Вопрос

Web service и обработка данных по событию

Добрый день. Подскажите пожалуйста как добавить данные, которые пришли по 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;
        }

 

соответственно события при этом не отрабатывают.

Нравится

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

Добрый день,  Олег.



Чтобы запись обработалась по событию необходимо сохранять и добавлять ее с помощью EntitySchemaQuery методом Save. Более детально о EntitySchemaQuery:

https://academy.terrasoft.ru/docs/7-16/developer/back-end_development/o…



Более детально как добавить данные:

https://community.terrasoft.ru/questions/c-dobavlenie-dannykh-entitysch…

Mykhailo Storozhuk,

Спасибо, теорию я уже прочитал, мне бы на примерах :)

 

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[]&
			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)</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

Всем большое спасибо за помощь.

Всё заработало. 

Дело было в строке

 

EntitySchema schema = SystemUserConnection.EntitySchemaManager.GetInstanceByName("UsrTestWebHook");

 

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