Есть анонимный сервис с post и с другого локалхоста не получается достучаться без OPTIONS ендпоинта который заполнит нужные хедеры. Если уже делать этот OPTIONS эндпоинт, то хотелось бы не для каждого уровня с UriTemplate = "/{s}", а что-то типа UriTemplate = "*", но с "*" - не работает.



Вопрос как сделать что-бы матчило по всем входящим юрлам любой вложености(/) или как сделать что бы CORS не вываливался по другому. 



Сейчас для каждого уровня пишется костыль типа:

 

        [OperationContract]

        [WebInvoke(Method = "OPTIONS", UriTemplate = "/{s}")]

        public void GetOptions(string s) {

            var outgoingResponseHeaders = HttpContextAccessor.GetInstance().Response.Headers;

            outgoingResponseHeaders["Access-Control-Allow-Origin"] = "*";

            outgoingResponseHeaders["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS";

            outgoingResponseHeaders["Access-Control-Allow-Headers"] = "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source";

            outgoingResponseHeaders["Access-Control-Request-Headers"] = "X-Requested-With, x-request-source, accept, content-type";

        }

Делалось по гайду тут, но не сработало так как надо. 

 

Нравится

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

Если есть такой вариант, то можно отключить проверку CORS, а именно:

 

1) В Web.config лоадера (внешний Web.config) заменить <add origin="*" allowed="false"/> на <add origin="*" allowed="true"/> 

2) В web.config лоадера заменить <cors enabled="true"> на <cors enabled="false">

 

После этого можно попробовать выполнить запрос еще раз.

Oleg Drobina,

спасибо, но у меня .net core.

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

Добрый день.

Есть некий web-service (wcf и использует wsHttpBinding) и методы для работы с ним.
Необходимо из террасофта работать с данными методами.

Есть понимание как это сделать в Visual Studio например на с#
Для этого к проекту добавляется ServiceReference (с указание ссылки на наш веб-сервис), на его основе создается объект и дальнейшая работа (авторизация и обращение к методам) происходит через этот объект. Примерно так...

SomeServiceReference.ServiceClient client = new SomeServiceReference.ServiceClient();
if (client.ClientCredentials != null)
{
client.ClientCredentials.UserName.UserName = "UserName";
client.ClientCredentials.UserName.Password = "Password";
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
}

try
{
return client.InvokeMethod( parameter );
}
catch( Exception ex )
{
client.Abort();
throw ex;
}
finally
{
if( client != null ) client.Close();
}

В с# также есть возможность программно создать экземпляр System.ServiceModel.WSHttpBinding и с помощью него организовать взаимодействие со сторонним веб-сервисом.
А вот как организовать подобную схему из Террасофта не понятно.

Прошу прощения если не достаточно ясно излагаю мысли :smile: Сталкиваюсь с данной тематикой впервые. Возможно кому то уже приходилось реализовывать что то подобное.

Спасибо.

Нравится

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

Можно Вашу разработку на C# переделать в COM-объект. А затем этот объект в Terrasoft 3.Х вызывать из скрипта.

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

Добрый день, коллеги!
Есть BPMOnline On-Demand с простым бизнес процессом который вставляет новый Лид.
Этот бизнес процесс вызывается поверх http с web-портала.
В общем виде, получается пара запросов:

// 1. Авторизация
HttpWebRequest.Create("https://....bpmonline.com/ServiceModel/AuthService.svc/Login?...");
...
// 2. Вызов бизнес процесса
HttpWebRequest.Create("https://....bpmonline.com/1/ServiceModel/ProcessEngineService.svc/ImportExternalLeadProcess/Execute?...");

Столкнулся с проблемой плохой производительности такого решения.
Запрос на авторизацию [1] выполняется стабильно за ~0.5c, а вот вызов БП [2] в первый раз после длительного перерыва (несколько часов) может выполняться 20-30с. При этом все последующие запросы отрабатывают все за те же стабильные ~0.5c.

С чем может быть связана такая деградация производительности?
Возможно есть настройка решающая проблему или есть путь обойти ее?

Нравится

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

В IIS по умолчанию для пула приложений идет таймаут простоя (idleTimeout) 20 минут
Через 20 минут IIS завершит выполнение рабочего процесса (если к нему нету других обращений), и при следующем обращении IIS будет повторно создавать рабочий процесс.
Возможно, вам подойдет увеличить таймаут простоя до большего значения (настройка Пула приложений->Advanced settings->Idle timeout (minutes))

Здравствуйте.

При длительном отсутствии обращений к серверу ( 20 минут), сервер переходит в «спящий» режим (Idle). В этом режиме сбрасываются все кэши сервера, а также очищается память от выполненных запросов. При первом запросе сервер переходит в режим Normal (это занимает некоторое время).
2) При первом обращении к разделу или первое открытие карточки, после перехода сервера из режима Idle в режим Normal, приложение обращается к базе данных за необходимыми ресурсами и создает экземпляры классов для страницы, которые в результате сохраняются в кэш (это занимает приблизительно 7 сек. на сервере). При повторном обращении к уже закэшированной странице, она откроется за нормальное время (порядка 2,5-3 секунд), так как большинство необходимых данных берутся из кэша.

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

Для решения проблемы можно увеличить таймаут сервера, к примеру до 24 часов. Если за 24 часа работы с приложением не будет - он перейдет в Idle.

Сообщите название Вашего сайта с приложением (можно в личку) - мы увеличим для Вас таймаут.

Добрый день!
Спасибо большое за разъяснение. Я что-то подобное предполагал.
Увеличьте пожалуйста таймаут до 24 часов для extrimassistance.bpmonline.com

Валерий, здравствуйте.
Уточните время и дату, когда можно будет провести процедуры - т.к. потребуется перезагрузка сайта, в течении которой система будет недоступна.

Дмитрий, здравствуйте.
Завтра (29.01.2013) в течении дня сайт будет свободен, можно провести необходимые работы.
Спасибо.

Валерий, хорошой.

Сообщу Вам дополнительно после внесения изменений.

Готово.

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

В этой статье я расскажу принципы работы с веб-сервисами Terrasoft из внешних приложений. С помощью этих механизмов можно реализовать различные интеграционные задачи с любой внешней системой.

Работать с Web-сервисами из сторонних приложений можно двумя способами, все зависит от цели использования и конкретного языка программирования:
1. Работа через COM-объекты Terrasoft
2. Работа с Web-сервисами напрямую

Работа через COM-объекты

Первый вариант наименее трудоемкий и более удобный, но требует, чтобы на клиентской машине были зарегистрированы библиотеки Terrasoft (для использования COM-объектов). При этом вся работа с Web-сервисами будет выполняться COM-объектами Terrasoft, предоставляя доступ к данным и объектам через объектную модель платформы Terrasoft: IDataset, ISelectQuery и т.д.

Для подключения программно нужно выполнить следующий код (пример на Jscript, но это можно реализовать на любом языке, который работает с COM-объектами):

 

         // Создание экземпляров COM-объектов Connector и Configuration
         WSConnector = new ActiveXObject('TSDskObjectLibrary.DskConnector');      // Для версий 3.4.0+ объект создается ActiveXObject('TSObjectLibrary.Connector')
         var WSConfiguration = new ActiveXObject('TSObjectLibrary.Configuration');  
         WSConfiguration.DBExecutorTypeCode = 'WebServices';

         // Кэшироование созданного соединения
         Connector.Attributes('WSConnector') = WSConnector;

         // Установка строки соедения и название конфигурации настроенной на сервере
         WSConfiguration.SetConnectionString(
                   '"URL=http://192.168.227.128/TSWebServicesServerLibrary.dll/soap/IServer"' +
                   ',"ConfigurationName=Dev332"');

         // Открытие конфигурации
         var IsConnected = WSConnector.OpenConfiguration(
                   WSConfiguration,
                   1,           // Тип аутентификации: 0 - Windows Authentication, 1 - Server
                   'ddd',       // Имя пользователя
                   '');         // Пароль

 

После успешного подключения можем обращаться к любым объектам, получать данные и т.д. Например получение данных о контрагентах:

 

         // Получение сервиса ds_Account из коннектора к веб-сервисам
         var AccountDataset = WSConnector.Services.GetSingleItemByUSI('ds_Account');
         
         // Подготовка датасета: закрытие и очистка фильтров
         AccountDataset.Close();
         EnableDatasetFilters(AccountDataset, false);
         
         // Наложение фильтра по ID текущей записи
         ApplyDatasetFilter(AccountDataset, 'ID', dlData.Dataset('ID'), true);
         
         // Открытие датасета
         AccountDataset.Open();
         
         // Считывание данных
         if (AccountDataset.IsEOF) {
                   var Value = '(нет данных)';
                   edtWSName.Value = Value;
                   edtWSOfficialName.Value = Value;
                   edtWSCode.Value = Value;
         } else {
                   edtWSName.Value = AccountDataset.ValAsStr('Name');
                   edtWSOfficialName.Value = AccountDataset.ValAsStr('OfficialAccountName');
                   edtWSCode.Value = AccountDataset.ValAsStr('Code');  
         }
         
         // Закрытие датасета
         AccountDataset.Close();

 

Во вложении полный пример работы с Web-сервисами на Jscript, используя COM-объекты.

Работа с Web-сервисами напрямую

Этот тип работы сложнее, т.к. все запросы к Web-сервисам нужно посылать самостоятельно, а также самому обрабатывать ответ от сервера. При этом не используются COM-объекты Terrasoft, соответственно не нужно устанавливать и регистрировать библиотеки Terrasoft на каждом клиентском компьютере, откуда будут запрашиваться веб-сервисы.

Запросы Web-сервисам можно отправлять исходя из их интерфейса (WSDL) – описания всех методов с параметрами.

Для упрощенной разработки программ для работы с Web-сервисами в некоторых IDE, например Visual Studio, предусмотрен импорт WSDL (Add WebService Reference), при этом сама IDE генерирует оберточные классы для работы с Web-сервисами. Вызывая методы такого класса вы будете упрощенно вызывать соответствующие методы веб-сервиса.

Упрощение заключается в том, что для вызова метода Web-сервиса нужно отправить полный XML запрос, а с помощью оберточных классов – просто вызвать соответствующий метод с параметрами.

Пример на C# :

// Создание клиента Web-сервиса
        ws.IServer sc = new ws.ServerClient(); // ws.IServer – оберточный класс для работы с Web-сервисами Terrasoft
        ws.OpenConfigurationRequest rqOpenConfiguration = new ws.OpenConfigurationRequest(); // Запросы для открытия конфигурации
        ws.OpenConfigurationResponse rsOpenConfiguration = new ws.OpenConfigurationResponse();

// Открытие конфигурации
rqOpenConfiguration.ACompressionLevel = 0; //Without compression (zip)            
         rqOpenConfiguration.AConfigurationName = Configuration;
         rqOpenConfiguration.ADBExecutorTypeCode = "MSSQL";
         rqOpenConfiguration.AUserName = UserName;
         rqOpenConfiguration.AUserPassword = Password;
         rsOpenConfiguration = sc.OpenConfiguration(rqOpenConfiguration);

 

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

Во вложении полный пример работы с Web-сервисами на C#.

Отдельное спасибо Александру Кравчуку за предоставленные примеры.

Приятной разработки:)

Нравится

Поделиться

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

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

Подскажите:
1) Доступна ли настройка веб сервиса на версии Terrasoft CRM 3.3.2.X ?
2) Приходилось ли применять какой то из способов на практике?

Здравствуйте, Анна!

1. Возможность настройки веб-сервиса на версии Terrasoft CRM 3.3.2 доступна.
2. Приведенные примеры взяты с реальных практических решений.

Простите, а нельзя ли прислать на почту neveryes@bk.ru полный пример работы с Web-сервисами на C#.

Потому что вложения как такового нет((

и на почту qart2003@gmail.com 

заранее спасибо!

Вложения можно скачать тут и тут. Обратите внимание, это всё о Terrasoft 3.Х.

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