Доброго времени суток коллеги. У меня возникли две проблемы. Имею вызов метода 


      SetUrlAnswer: function() {
 
        var xhr = new XMLHttpRequest();
 
        var url = "http://localhost/0/rest/Service1/Testing";
 
        xhr.open("GET", url);
 
        xhr.responseType = "json";
 
        xhr.setRequestHeader("Content-type", "application/json");
 
        var self = this;
 
        xhr.onreadystatechange = function() {
 
            if (xhr.readyState === 4 && xhr.status === 200) {
 
                // for (var i = 0; i < xhr.length; i++ ) {
 
                  self.set("UsrCharCode",
 
                   JSON.stringify(xhr.response[0].CharCode));
 
                  self.set("UsrID", 
 
                   JSON.stringify(xhr.response[0].ID));
 
                  self.set("UsrNameV", 
 
                   JSON.stringify(xhr.response[0].Name));
 
                  self.set("UsrNominal", 
 
                   JSON.stringify(xhr.response[0].Nominal));
 
                  self.set("UsrNumCode",
 
                   JSON.stringify(xhr.response[0].NumCode));
 
                  self.set("UsrPrevious", 
 
                  JSON.stringify(xhr.response[0].Previous));
 
                  self.set("UsrValues", 
 
                   JSON.stringify(xhr.response[0].Value));
 
                // }
 
 
 
            } else {
 
               // Пока не реализовано
 
                self.set("UsrCharCode", "Не правильное получение данных!");
 
            }
 
        };xhr.send();
 
 

Как мне сделать правильную итерацию? Чтобы вот такого говно-кода избежать?



Вопрос второй(очень важный): Этот метод возвращает каждый раз разный массив данных. Вопрос в  том  Creatio предусмотрено генерация полей исходя из ответа сервера? Например мне в ответ приходит 4 видов валют USD, RUB, EUR, UZS и исходя из ответа сгенерировать таких групп полей:Изображение удалено.Надеюсь смог объяснить свою боль. Спасибо

Нравится

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

Ислам Ибрагимжанов,

Я описал общую идею как работает DataService, можете поискать реализацию и попробовать понять, но это про сложные вещи.



Вам пока нужно начать использовать ServiceHelper и его функцию callService.

И читайте документацию, там такие кейсы описаны.

Зачем вы используете чистый XMLHttpRequest, уже есть классы для работы с сервисами.

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

Итерацию можно сделать циклом по массиву с наименованиями полей. Можно сделать по переменным объекта. Список полей для итерации можно возвращать со стороны сервера. Тут у вас полная свобода действий.

Полозюков Евгений Петрович,

Я не понял один момент

Список полей для итерации можно возвращать со стороны сервера. Тут у вас полная свобода действий. 

Вы это про мой второй вопрос? Я что то не до  конца понял. 

Ислам Ибрагимжанов,

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

Полозюков Евгений Петрович,

Мне нужно сгенерировать поля для этих данных. Через выше указанный способ релаьно реализовать такое?

Ислам Ибрагимжанов,

Я описал общую идею как работает DataService, можете поискать реализацию и попробовать понять, но это про сложные вещи.



Вам пока нужно начать использовать ServiceHelper и его функцию callService.

И читайте документацию, там такие кейсы описаны.

Полозюков Евгений Петрович, Спасибо за помощь. Я понял идеюyes

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

Добрый день. Сейчас через скрипт рекордер записываю действия и прогоняю по этому сценарию нагрузку. Вопрос у заказчика в другом, почему к примеру, при нагрузке в 600 пользователей не создаётся 600 тестовых обращений хотя по скрипту записано от и до. Авторизация в JMeter работает.

Нравится

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

Думаю, заказчику лучше обратиться с вопросом к тому, кто разрабатывал сценарий. Без подробностей сложно сказать, что именно он делает в системе. Например, если каждый раз сохранять запись о новом обращении с одним и тем же Id (а при нормальной работе он уже есть в запросе к /0/DataService/json/SyncReply/InsertQuery), то не создастся много записей, а будут ошибки.

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

Вызвал сервис методом callService, но не понимаю, как получить данные из своего сервиса. В методе сервиса возвращается аргумент типа String. Хотел бы его на клиентском коде как-то вывести.

runService: function () {
				ServiceHelper.callService({
					serviceName: "CustomService",
					methodName: "ReturnCurrentUser",
					callback: function() {
                        Terrasoft.utils.showMessage({
                            caption: "Сервис запустил ",
                            buttons: [Terrasoft.MessageBoxButtons.OK.returnCode],
                            defaultButton: 0,
                            scope: this
                        });
					},
					scope: this
				}, this);
			},

 

Нравится

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

в аргументе метода

callService передайте параметр callback: function(response) {
var answer = response.ReturnCurrentUserResult;
ваш обработчик ответа
}
И scope: this 

В самом callService this не нужен

 

в аргументе метода

callService передайте параметр callback: function(response) {
var answer = response.ReturnCurrentUserResult;
ваш обработчик ответа
}
И scope: this 

В самом callService this не нужен

 

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

Добрый день.

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

 

[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 и др.

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

Доброго дня, имеется bpm которая при GET запросе 0/ServiceModel/EntityDataService.svc/ContactColletion возвращает xml с контактами, можно ли GET запросом возвращать JSON и если да, то где про это написанно? Если нельзя, то как вернуть JSON для oData 3?

Нравится

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

Добавьте header к запросу

Accept: application/json;odata=verbose

Добавьте header к запросу

Accept: application/json;odata=verbose

я смог сделать это в постмане, но все же не понятно, мб подскажете возможно ли в террасофте возвращать json по обращению к uri, если можно сделать это не переписывая сервис, буду благодарен за подсказку)

условно я иду по адресу /0/ServiceModel/EntityDataService.svc/ContactCollection и мне падает 

 

{

    "d": {

        "results": [

            {

                "__metadata": {

                    "id": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "type": "Terrasoft.Configuration.Contact"

                },

                "Photo": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }

                },

                "Owner": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }

...и т.д.

Насколько понял, только заголовком. Такой формат здесь не поддерживается: «ContactCollection?$format=json». А в OData 4 по умолчанию идёт JSON.

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

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

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

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.Х, а в отдельной своей программе и проверить, всё ли нормально в конфиге.

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

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

Есть задача: сделать веб-сервис, принимающий на вход сложное json-тело.

В ходе реализации столкнулась с двумя проблемами:

1. Не нашла, как описать прием сложного параметра в сервисе, кроме робкого указания на модификаторы [DataContract] и [DataMember]. Подскажите, где-нибудь есть информация об этом? 

2. При вызове из Postman сервис возвращает ответ "403 - Вы не имеете разрешения на просмотр этого каталога пли страницы." (скриншот ниже). Нужно ли где-то отдельно прописывать права на доступ к сервисам?

 

Скриншот ошибки:

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

Листинг пример json тела запроса.

{
"scoring_events" : [
		{
			"type" : "pageview",
			"page_url" : "https://bpmonline.com/",
			"datetime_utc" : "2018-08-08 12:00:12",
			"responsible_user" : {
				"name" : "Иван Иванов",
				"email" : "i.ivanov@yandex.ru",
				"type" : "user"
			},
			"partner" : {
				"name" : "ООО Ромашка"
				"bpm_id" : "783967ef-c629-4f1d-8cd4-3b3dba955ffc",
				"contact_email" : "n.ivanova@yandex.ru"
			}
		},
		...
		{
			...
		}
	]
}

 

листинг сервиса:

namespace Terrasoft.Configuration.WScoringService
{
	using System;
<...>
#region Class: WScoringService 
	[ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class WScoringService : BaseService
	{
        private WScoringServiceResponse wScoringServiceResponse;
 
        #region Methods: Public
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string AddScoringEvent(List<ScoringEvent> scoring_events)
        {
            if (scoring_events.IsEmpty()) wScoringServiceResponse = new WScoringServiceResponse(true, "empty");
            else wScoringServiceResponse = new WScoringServiceResponse(true, scoring_events[0].ToString());
            return wScoringServiceResponse.ToJsonString();
        }
        #endregion
        #region  DataContract
	    [DataContract]
	    public class ScoringEvent
	    {
	    	[DataMember]
	        public string type;
	        [DataMember]
	        public string page_url;
	        [DataMember]
	        public string datetime_utc;
	        [DataMember]
	        public ResponsibleUser responsible_user;
	        [DataMember]
	        public Partner partner;
	        public override string ToString()
	        {
	            string result;
	            result = "type=" + type + ";";
	            result += "page_url=" + page_url + ";";
	            result += "datetime_utc=" + datetime_utc + ";";
	            result += "responsible_user_name=" + responsible_user.name + ";";
	            result += "partner_name=" + partner.name + ";\n";
	            return result;
	        }
	    }
	    [DataContract]
	    public struct ResponsibleUser
	    {
	    	[DataMember]
	        public string name;
	        [DataMember]
	        public string email;
	        [DataMember]
	        public string type;
	    }
	    [DataContract]
	    public struct Partner
	    {
	    	[DataMember]
	        public string name;
	        [DataMember]
	        public string bpm_id;
	        [DataMember]
	        public string contact_email;
	    }
	    #endregion
    }
    #endregion
 
    #region Class: WScoringServiceResponse
    public class WScoringServiceResponse
    {
        private bool success;
        private string message;
        public WScoringServiceResponse() { }
        public WScoringServiceResponse(bool success, string message = null)
        {
            this.success = success;
            this.message = message;
        }
        public string ToJsonString()
        {
            string result = "{\"status\":\"";
            if (success) result += "ok\",";
            else result += "error\",";
            result += "\"message\":\"" + message+ "\"}";
            return result;
        }
    }
    #endregion
}

 

Нравится

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

Примеры сервисов можно найти в конфигурации. Например, [DataContract] и [DataMember] применяют в CurrentUserService так:

[DataContract]
public class UserCultureInfo
{
	[DataMember(Name = "timeZoneCode")]
	public string TimeZoneCode { get; set; }
 
	[DataMember(Name = "timeZoneName")]
	public string TimeZoneName { get; set; }
 
	[DataMember(Name = "timeZoneId")]
	public Guid TimeZoneId { get; set; }
 
	[DataMember(Name = "cultureId")]
	public Guid CultureId { get; set; }
 
	[DataMember(Name = "cultureName")]
	public string CultureName { get; set; }
 
	[DataMember(Name = "cultureLanguage")]
	public string CultureLanguage { get; set; }
 
	[DataMember(Name = "dateTimeFormatId")]
	public Guid DateTimeFormatId { get; set; }
 
	[DataMember(Name = "dateTimeFormatName")]
	public string DateTimeFormatName { get; set; }
}

По поводу 403, такое бывает, если при отправке запроса к сервису не передать CSRF-токен.

И вот я пишу другой подобный сервис, привожу пример, который у меня заработал

 

Данные, которые отправляются в сервис:

{
    "WCases": [{
            "message": "webinar test",
            "user_crm_id": "CFAC23D8-8EEA-4EB6-A257-0001538F0723"
        }, {
            "message": "webinar test 2",
            "user_crm_id": "CFAC23D8-8EEA-4EB6-A257-0001538F0723"
        }
    ]
}

Код сервиса:

namespace Terrasoft.Configuration.WCaseService
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Collections.Generic;
    using Terrasoft.Core;
    using Terrasoft.Web.Common;
    using Terrasoft.Configuration.Slack;
    using System.Runtime.Serialization;
 
    #region WCaseService
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class WCaseService : BaseService
    {
        #region init
        private SystemUserConnection _systemUserConnection;
        private SystemUserConnection SystemUserConnection
        {
            get
            {
                return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection);
            }
        }
        #endregion
        #region main: endPoints
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string ImportData(List&lt;WCaseTemplate&gt; WCases)
        {
            string result = "";
 
            if (WCases != null)
            {
                foreach (WCaseTemplate wCasein WCases)
                {
                    result += "message: " + wCase.UserMessage + "\nuser_crm_id: " + wCase.UsrLoginId.ToString() + "\n";
                }
            }
            else result = "NULL";
 
            return result;
        }
        #endregion
    }
    #endregion
    [DataContract]
    public class WCaseTemplate
    {
        [DataMember(Name = "message")]
        public string UserMessage { get; set; }
 
        [DataMember(Name = "user_crm_id")]
        public Guid UsrLoginId { get; set; }
    }
}

 

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

Добрый день.

Планируем использовать свой конфигурационный сервис для интеграции со сторонним приложением. Стороннее приложение всегда будет аутентифиицироваться под одним и тем же пользователем в BPMonline. В связи с этим хотелось бы оптимизировать этот процесс.

 

Как показывают тесты, выполнение логина каждый раз перед обращение к конфигурационному сервису сильно замедляет процесс получения полезного ответа (примерно в 2 раза), увеличивает трафик, нагрузку на сервер приложений и тд. 

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

1. Как регулярно нужно аутентифицироваться в BPMonline ?

2. Можно ли перед тем как обращаться к конфигурационному сервису как-то убедиться, что аутентификация успешно выполнена и непросрочена, не посылая дополнительных запросов в BPM?

Вот такой код не работает, поскольку свойства Expires и Expired заполняются только у куки UserName и там примерно сутки время жизни, а 401 ошибку мы начинаем получать гораздо раньше

       public static bool CheckCookiesValid()
        {
            var cookieContainer = LoginClass.AuthCookie;
            var cookies = cookieContainer.GetCookies(new Uri(serviceUri));
            if (cookies.Count < 4)
            {
                return false;
            }
            foreach (Cookie cookie in cookies)
            {
                if (cookie.Expired)
                {
                    return false;
                }
             }
            return true;
        }

или же не стоит с этим всем заморачиваться и просто каждый раз перед обращением к сервису делать LoginClass.TryLogin ?

полный исходник прилагаю

Прикрепленные файлы

Нравится

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

Каждый раз авторизироваться точно не стоит, это захламляет таблицу SysUserSession, которая вырастает до огромного объёма и каждая вставка в неё проходит всё тяжелее.

Пример работы с авторизацией, а затем с данными по интеграции есть в академии.

Прерывание сессии раньше срока может быть вызвано различными причинами, например, очисткой Redis на сервере. Если при попытке считать или записать данные выдало об отсутствии авторизации, проще авторизироваться раз повторно и далее работать уже с новыми куками.

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

Доброго дня.

Необходима интеграция с корзиной сайта, откуда заказы валятся на Magento 1.

Настроено API: есть URL-адрес для подключения с Magento, user и login.

Не понятна сама настройка веб-сервиса в bpm'online. Сталкивался ли кто-то с данной интеграцией, либо может кто-то теоретически понимает это?

Нравится

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

Добрый день!

Не уверен, что есть какой-то готовый коннектор (по крайней мере на маркете я ничего не нашёл), но в любом случае, можно запилить свою интеграцию через свой SOAP сервис. Правда для этого нужны компетенции и в bpm и в api magento.

Дополнение. Подключение посредством SOAP.

Добрый день!

Не уверен, что есть какой-то готовый коннектор (по крайней мере на маркете я ничего не нашёл), но в любом случае, можно запилить свою интеграцию через свой SOAP сервис. Правда для этого нужны компетенции и в bpm и в api magento.

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

Коллеги, приветствую!

Следующая ситуация возникла - с внешнего веб-сервиса прилетает ответ на bpmonline. В логах внешнего веб-сервиса видим, что ответ отправляется с данными, однако когда он доходит до bpmonline - данных нет, http код равен 0 и тело ответа пустое. Типы данных верны, ответы от других внешних веб-сервисов приходят с данными, как надо. И в Postman тоже все в порядке - проблема возникает только в bpmonline. Вопрос в следующем - где могут теряться данные? Может ли IIS менять тело ответа? Будем признательны за любую помощь.

Нравится

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

Что дергает в bpm внешний веб сервис? Привидите код получения и обработки ответа внешнего веб сервиса.

Григорий Чех,

Спасибо за ответ, проблема разрешилась. Дело было в веб-сервисе.

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