Добрый день!

Столкнулся со следующей ситуацией: 

При запросе авторизации к AuthService через fiddler возвращаются данные BPMCSRF, и при запросе к кастомному сервису указывая данный аттрибут в хэдере запроса получаю ответ 200, ок.

Однако, при программном вызове AuthService через метод, предоставленный на статье академии (TryLogin) и при запросе к сервису с данными Cookie получаю ответ 403 - запрещено. Ошибка возникает, т.к. нет отдельного хэдера BPMCSRF содержащего значения из Cookie.

Вопрос, как добавить данные  BPMCSRF в запрос программно?

Нравится

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



Здравствуйте, Дмитрий.

Вы должны из кук получить параметр, и добавить его в хедер:

 CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));

    string csrfToken = cookieCollection["BPMCSRF"].Value;

    ((HttpWebRequest)e.Request).Headers.Add("BPMCSRF", csrfToken);



Детали по ссылке - https://academy.terrasoft.ru/documents/technic-sdk/7-12/zashchita-ot-cs…

Сергей Кy6риш,

Сергей, спасибо, все получилось.

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

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

Не могу получить конкретную системную настройку из клиентского кода (ошибка на скриншоте) на пользователях-аутсорсерах (не входят в роль "Все сотрудники компании", если это важно). При этом эта же настройка нормально загружается для остальных пользователей, этот же пользователь нормально получает другие настройки. Пересоздавать настройку пробовал, не помогает. В чем может быть дело/как починить?

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

Нравится

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

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

Уточните, пожалуйста, как именно Вы получаете значение системной настройки? Есть листинг кода? 

 

Вильшанский Дмитрий, 

this.Terrasoft.SysSettings.querySysSettingsItem('SlaCalculationEnabled', function (slaEnabled) {console.log(slaEnabled)})

При этом если запросить какую-нибудь несуществующую настройку, то ошибка не выводится, приходит просто undefined

Добрый день.

Ошибка не совсем правильно передает суть проблемы. Дело в правах – т.е. у пользователя нет прав на данную настройку.

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

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

Имел ли кто дело с реализацией анонимной аутентификации внешних запросов, например, к написанному Вами web-сервису по аналогии с сервисом оценок обращений?

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

Нравится

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

Добрый день, Михаил.

Этот функционал разработан для продукта Service, соответственно требует наличия этого продукта в Вашей системе. Инструкция по настройке веб-сервисов, доступных без авторизации:

 

Для того, чтобы реализивать конфигурационный веб-сервис, для обращения к которому не нужно авторизировать пользователя, необходимо:

  • в WebApp\ServiceModel зарегистрировать веб-сервис, в котором будет указан путь к конфигурационному веб-сервису. Например, <Название сервиса>.svc, с содержимым:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.<Название сервиса>" %>
  • в WebApp\Web.config добавить:
<location path="ServiceModel/<Название сервиса>.svc">
  <system.web>
    <authorization>
      <allow users="*" />
    </authorization>
    </system.web>
</location>
  • в WebApp\Web.config секции appSettings изменить значение ключа AllowedLocations. В значение добавить:
ServiceModel/<Название сервиса>.svc
  • в конфигурации реализовать веб-сервис. Например:
namespace Terrasoft.Configuration 
{
         using System;
         using System.Runtime.Serialization;
         using System.ServiceModel;
         using System.ServiceModel.Activation;
         using System.ServiceModel.Web;
         using System.Web;
         using Terrasoft.Core;
         using Terrasoft.Web.Common;

 
         [ServiceContract]
         [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
         public class ConfigurationService : BaseService
         {

 
                 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 void Post() {
                 }

 
                 [OperationContract]
                 [WebGet(RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
                 public void Get() {
                 }
         }
}
  • в WebApp\ServiceModel\http|https\services.config добавить:
<service name="Terrasoft.Configuration.<Название сервиса>">
  <endpoint name="<Название сервиса>EndPoint"
    address="" 
    binding="webHttpBinding"
    behaviorConfiguration="RestServiceBehavior"
    bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
    contract="Terrasoft.Configuration.<Название сервиса>" />
</service>

Сервис будет доступен по адресу WebApp/<Номер конфигурации>/ServiceModel/<Название веб-сервиса>.svc/<Название веб-метода>

Т.к. пользователь не авторизирован, то UserConnection не будет проинициализирован (Session["UserConnection"] == null).

 

Добрый день! 

Настроил анонимный веб-сервис по инструкции. С авторизованным пользователем отрабатывает, а без авторизации сервер возвращает 302. Кто нибудь сталкивался с такой проблемой?

Руслан, значит, получился не анонимный. Может, его неправильно включили на уровне настроек сайта в конфигах?

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

По поводу длины, для названий веб-сервисов о таких ограничениях не слышал. Было подобное только для названий объектов, когда по объекту со слишком длинным названием включали права, группы и подобное, название вспомогательной таблицы групп или прав становилось длиннее зашитого в ядре лимита, добавленного для совместимости с Oracle.

 

Ну и наоборот, в БП элементе вызова веб-сервиса есть лимит на длину названия в поле Code в методе вызова внешнего веб-сервиса, со слишком длинным сохранить нельзя.

 

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

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

Добрый день!

Реализовал простейший Wcf сервис в BPM Online. Прописал все конфиги, по ссылке стало доступно описание сервиса http://localhost:89/0/ServiceModel/NewWebService.svc.



Создал консольное клиентское приложение, привожу код ниже. Получаю данные авторизации CookieContainer согласно примеру на академии. А вот дальше в ответ на запрос получаю ошибку: Удаленный сервер возвратил ошибку:403 запрещено. При этом аналогичный сервис размещенный в IIS работает корректно. Подскажите, как можно решить проблему.

Console.WriteLine("Успешна ли аутентификация?: {0}", TryLogin("Supervisor", "Supervisor"));

                string uri = "http://localhost:89/0/ServiceModel/NewWebService.svc/getCurrencyList";

                var currencyRequest = new NewWebService.request();

                currencyRequest.Id = "22";

                currencyRequest.operation = "getCurrencyList";

                currencyRequest.getCurrencyListParameters = new List();

                XmlSerializer serializer = new XmlSerializer(typeof(NewWebService.request));



                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

                request.CookieContainer = AuthCookie;

                //request.KeepAlive = true;

                request.Method = "POST";

                request.ContentType = "text/xml";

                using (Stream requestStream = request.GetRequestStream())

                {

                    serializer.Serialize(requestStream, currencyRequest);

                }

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                using (Stream responseStream = response.GetResponseStream())

                {

                    var responseStr = new StreamReader(responseStream).ReadToEnd();

                    responseStr = HttpUtility.HtmlDecode(responseStr);

                    XmlSerializer deserializer = new XmlSerializer(typeof(CurrencyServiceResponse.Response));

                    using (TextReader reader = new StringReader(responseStr))

                    {

                        var responseObj = (CurrencyServiceResponse.Response)deserializer.Deserialize(reader);

                    }

                }               

                response.Close();

Нравится

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

Добрый день, Дмитрий!

Система может возвращать 403 на POST запросы в случае есть в Web.config включен UseCsrfToken

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

Тогда хедер http запроса должен выглядеть следующим образом:

Если это локальная разработка, и нет необходимости в csrf-защите, то можно отключить UseCsrfToken. (https://academy.terrasoft.ru/documents/technic-sdk/7-11/zashchita-ot-cs…)

Добрый день! Отключил в конфиге UseCsrfToken и теперь по ссылке http://localhost:89/0/ServiceModel/NewWebService.svc в браузере отображается ошибка: Сайт localhost выполнил переадресацию слишком много раз. Вернул конфиг на исходное значение, ошибка сохранилась.

Теперь сервис вновь доступен, запрос из клиента возвращает 400. Csfr отключен.



При запросе из fiddler вовращает 302.

a6

<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="/0/ServiceModel/NewWebService.svc/getCurrencyList">here</a>.</h2>

</body></html>

 

 

Ошибка 400 - это Bad Request. У вас что-то не так с вызовом. Без описания сервиса и его метода сложно судить. Попробуйте создать отдельно WCF Service Application с вашим сервисом и потестируйте на нем

Через WCF Service Application развернутый в IIS работает. Описание сервиса и методов ниже.

//[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

public class NewWebService : INewWebService

    {

        public ResponseData Auth(RequestData RequestData)

        {

            var data = RequestData.details.Split('|');

            var response = new ResponseData

            {

                Name = data[0],

                Age = data[1],

                Exp = data[2],

                Technology = data[3]

            };

            return response;

        }

        public response GetCurrencyList()

        {

            var resp = new response();

            resp.value = "<getCurrencyList><CurrencyList><externalId>EUR</externalId><isoCode>978</isoCode><isoTxt>EUR</isoTxt><cb>571.25</cb><sell>580</sell><buy>568</buy><CshSell>580</CshSell><CshBuy>568</CshBuy><CshBuyTrf>568.5</CshBuyTrf><name><translation lang=\"ru\" value=\"ЕВРО\" /><translation lang=\"en\" value=\"\" /><translation lang=\"am\" value=\"ԵՎՐՈ\" /></name><country /></CurrencyList><CurrencyList><externalId>RUR</externalId><isoCode>643</isoCode><isoTxt>RUR</isoTxt><cb>8.31</cb><sell>8.4</sell><buy>8.18</buy><CshSell>8.4</CshSell><CshBuy>8.18</CshBuy><CshBuyTrf>8.23</CshBuyTrf><name><translation lang=\"ru\" value=\"Российский рубль\" /><translation lang=\"en\" value=\"Russian ruble\" /><translation lang=\"am\" value=\"Ռուսական ռուբլի\" /></name><country>RUS</country></CurrencyList><CurrencyList><externalId>USD</externalId><isoCode>840</isoCode><isoTxt>USD</isoTxt><cb>478.39</cb><sell>480</sell><buy>477</buy><CshSell>480</CshSell><CshBuy>477</CshBuy><CshBuyTrf>477.5</CshBuyTrf><name><translation lang=\"ru\" value=\"Доллар США\" /><translation lang=\"en\" value=\"US dollar\" /><translation lang=\"am\" value=\"ԱՄՆ դոլար\" /></name><country>USA</country></CurrencyList><errorCode>0</errorCode></getCurrencyList>";

            return resp;

        }

    }

    [ServiceContract]

    [XmlSerializerFormat]

    public interface INewWebService

    {

        [OperationContract]

        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "auth")]

        ResponseData Auth(RequestData rData);

        [OperationContract]

        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "getCurrencyList")]

        response GetCurrencyList();

    }

}

Артем Гура,

Плюс при переходе в браузере по ссылке на сервис размещенный в IIS открывается страница Запрещенный метод, а на сервис размещенный в BpmOnline Http Error 400.

Тетиков Дмитрий Владимирович,

Разница между сервисом в IIS и в bpmonline в том что bpmonline необходимо пройти авторизацию и отправлять дополнительные токены и куки в хедере запроса.

Тут можно посмотреть примеры отправки запросов из Fiddler: https://academy.terrasoft.ua/documents/technic-sdk/7-11/vypolnenie-zapr…;

По аналогии вы можете отправлять запросы на NewWebService.svc

Еще раз хочу обратить внимание на хедер запроса: 

 

Проблема была в неверном конфиге. 

<service behaviorConfiguration="BaseServiceBehavior" name="CurrencyService.NewWebService">

При объявлении сервиса в аттрибуте name прописал название интерфейса, а не класса - сервиса.

Спасибо за рекомендации, теперь все работает корректно.

Tsopa,

В продолжение темы, подскажите пожалуйста, как сформировать запрос с Basic авторизацией. 

Отправляю в таком виде:

POST http://localhost:89/0/ServiceModel/NewWebService.svc/auth HTTP/1.1

Accept: text/xml

Content-Type: text/xml

Authorization: Basic U3VwZXJ2aXNvcjpTdXBlcnZpc29y 

Host: localhost:89

Content-Length: 191

<?xml version="1.0"?>

<RequestData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <details>Ivan|29|3years|C#</details>

</RequestData>



Получаю вот такой ответ:

 

HTTP/1.1 302 Found

Cache-Control: private

Transfer-Encoding: chunked

Content-Type: text/html; charset=utf-8

Location: /0/ServiceModel/NewWebService.svc/auth

Server: Microsoft-IIS/10.0

X-AspNet-Version: 4.0.30319

Set-Cookie: BPMSESSIONID=j22z5jiyd4njspgjq0tc32d0; path=/0; HttpOnly

Set-Cookie: .ASPXAUTH=; expires=Mon, 11-Oct-1999 19:00:00 GMT; path=/; HttpOnly

X-Powered-By: ASP.NET

X-Frame-Options: SAMEORIGIN

Date: Tue, 30 Jan 2018 09:06:22 GMT

9b

<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="/0/ServiceModel/NewWebService.svc/auth">here</a>.</h2>

</body></html>

0

 

Тетиков Дмитрий Владимирович,

Используя Basic аутентификацию можно обратиться только к EntityDataservice.svc. Для всех остальных внешних запросов рекомендуется использовать AuthService.svc и соответствующие Cookie.

Больше информации можно получить тут: https://academy.terrasoft.ru/documents/technic-sdk/7-11/autentifikaciya…

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

Добрый день.

Возможно ли реализовать механизм Webhooks на основании web-сервисов BPMonline?

Имеется в виду отправка запросов из сторонних сервисов на определённый url Bpmonline .

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

А внешний сервис со своей стороны может принять только один url для отправки запроса.

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

Нравится

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

Добрый день. В продукте Marketing был реализован функционал WebHooks для получения откликов, открытий от Mandrill.

Чубко Илья, добрый день

Если я не ошибаюсь, то описанный вами механизм работает в обратном порядке, т.е. в BPMonline вызываются Webhooks стороннего сервиса.

У меня же задача кардинально противоположная: вызывать webhooks bpmonline из стороннего сервиса.

 

вижу несколько способов:

1) Как вы  и написали в посте: сторонний сервис авторизуется и потом посылает данные в bpm. В данном случае надо всего лишь написать веб-сервис.

2) Веб-сервис без авторизации. Т.е всё то же самое, что и в 1 пункте, только надо перекопать web.config bpm и добавить в сервисы пару файлов. Ну и в итоге получается тот же веб-сервис, только к нему не надо авторизовываться.

3) web-to-object. Я так понял можно зарегистрировать внешнюю систему и создавать простые объекты(не полноценный сервис, но может кому-то нужен только функционал создания новых записей).

Коновалов Игорь,

Нет же, сервер Mandrill отправляет webhooks на систему. Зачем системе отправлять себе же и тем более как узнать статус webhooks, в отличии от Mandrill

Добрый день. Приведу пример настройки веб-сервиса без авторизации на примере настройки для нашего конвектора с Jivosite. https://drive.google.com/file/d/0B9WlZhrEuJlkaGlkZ194c3Utbmc/view?usp=s…

Посмотрите здесь. Данная инструкция открывает доступ без авторизации к созданному вами сервису (естественно его нужно сначала создать). В самом сервисе вы реализуете вызываемую логику и шлете данные с внешнего источника обычным post запросом.

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

https://academy.terrasoft.ua/documents/technic-sdk/7-16/kak-zapuskat-pr…

А в БП уже реализуете нужную логику. 

Как обработать данные только с определленного URL?

OLeg1020, добрый день!

 

Опишите, пожалуйста, подробнее задачу, которую Вам нужно реализовать.

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

Вот такой пример кода:

$soap = new SoapClient('http://crmserver/Terrasoft/TSWebServicesServerLibrary.dll/wsdl/IServer');
$wc = $soap->OpenConfiguration('Наша конфигурация', 'username', 'password',0);
$soap->CloseConfiguration($wc['ASessionUID']);
?>

Падает с ошибкой:

Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Server] Catastrophic failure in test.php:4
Stack trace:
#0 [internal function]: SoapClient->__call('CloseConfiguration...', Array)
#1 test.php(4): SoapClient->CloseConfiguration('0008DC3345AB512...')
#2 {main}

Ответ сервера:

version="1.0"?>
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
        >
                >
                        />
                        >SOAP-ENV:Server>

                        >Catastrophic failure>
                >
        >
>

Возможно, не хватает каких-то прав на сервере? каких?
Сервер IIS+Oracle, клиент FreeBSD

Виндовый клиент через SOAP работает отлично, только медленно.

Нравится

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

Имя конфигурации - русскими буквами. Может быть, в этом дело?

Вопрос закрыт. Действительно проблема была в русском имени конфигурации.

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

В продолжение темы:

http://community.terrasoft.ua/blogs/3521

Хочу продемонстрировать работоспособный вариант использования каласса itsTerrasoftWS

Веб написан на PHP + AJAX

Приятного просмотра!

Нравится

Поделиться

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

Хороший пример. А сколько времени заняло создание примера?

Сергей:

1 день - разобрался с веб-сервисами Terrasoft и создал класс

2 дня (пятница-суббота) - написание данного веб-приложения

Использовал GPL библиотеки: XAJAX, pChart, MailClass (для нотификации на Email о добавлении нового инцидента)

Есть еще несколько идей - буду развивать... :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Забыл детальку показать в разделе [Контрагенты]

--
www.it-sfera.com.ua
Terrasoft Solution Partner

А имя пользователя на ней есть?

А нужно? ;)

Тогда будет!

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Ну это мелкое замечание при взгляде со стороны. Думаю нужно.

Зачем имя пользователя? Имя пользователя в верхнем "гриде". Это ж деталька!

Женя, можно просто изменить приведенный в примере принцип аутентификации (не по контрагенту, а по контакту), тогда имя пользователя очень кстати :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

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

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

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

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

Нравится

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

Самым быстрым вариантом, думаю, будет сделать триггер.

Что бы не было дублирования номера должны генерится в одном месте. Логично в данном случае этим местом выбрать СУБД. Т.е. либо тригер, как предложил Александр Кравчук, но тогда не будет видно номера при редактировании. Либо слать запрос на получение номера до поста, но тогда в нумераци будут дырки.
Пока писал придумал еще простейший в реализации вариант - повесить уникальный ключ на поле :)

Сейчас задействована стандартная нумерация из системных настроек!

Решено перенести в тригер СУБД

--
Cogito, ergo sum

"Underscore a.k.a. _" написал:повесить уникальный ключ на поле :)

+1
Добавил :)

--
Cogito, ergo sum

Варианты

"Александр Кравчук" написал:
сделать триггер

или
"Underscore a.k.a. _" написал:
повесить уникальный ключ на поле

неудобны: или уникальный индекс будет выдавать ошибку или Вы не будет видеть какой номер у документа, счета и т.п.
Думаю самым приемлемым способом, будет светить какой-то номер во время добавления - пусть это будет через системные настройки, а перед добавлением пересчитывать на корректный: запускать ХП с выходным параметром, которая в свою очередь вычитывает текущее значение системной настройки, увеличивает на единицу, сохраняет и возвращает результат для сохранения в номере. Можно для надежности в транзакции ее запускать. Можно эту логику и в триггер вынести. Но тогда немного рассредоточится логика по формированию номера: и в конфигурации, и в триггере. Неудобно будет сопровождать. А ХП можно сделать универсальной - допустим только для числовых последовательностей.

ЗЫ

"Underscore a.k.a. _" написал:
в нумераци будут дырки.

Для этого есть или ну очень надуманные способы или запретить удаление :)

Соглашусь, что для

"Виталий Ковалишин aka samael" написал:
Как избежать в будущем дублирование нумерации счетов, которые создаются за короткий промежуток времени?

уникальный индекс самое то - на уровне сервера будет проверка целостности данных.

Такой вот вариант надумал:

CREATE TRIGGER tr_tbl_Invoice_IIN 
   ON  [tbl_Invoice]
   AFTER INSERT
AS 
BEGIN
	declare @ID uniqueidentifier, @NewNumber int,
		@Number nvarchar(250), @NumberMask varchar(10)
 
	SET NOCOUNT ON;
 
	select @ID = [ID], @Number = [InvoiceNumber] from inserted
 
    if (@Number is null)
    begin
	set @NumberMask = ( select [StringValue] from [tbl_SystemSetting] where [Code] = 'InvoiceMask' )
	set @NewNumber = ( select [IntegerValue] +1 from [tbl_SystemSetting] where [Code] = 'InvoiceNumber' )
	set @Number = REPLACE(@NumberMask, '%1', @NewNumber) 
	update [tbl_SystemSetting] set [IntegerValue] = @NewNumber where [Code] = 'InvoiceNumber'
	update [tbl_Invoice] set [InvoiceNumber] = @Number where [ID] = @ID
    end
 
END

--
Cogito, ergo sum

"Виталий Ковалишин aka samael" написал:
SELECT @ID = [ID], @Number = [InvoiceNumber] FROM inserted

Учтите, что inserted может содержать несколько записей.

"Осауленко Александр" написал:Думаю самым приемлемым способом, будет светить какой-то номер

А чем показывать в общем случае неправильный номер лучше, чем нек показывать его вообще.

"Осауленко Александр" написал:Учтите, что inserted может содержать несколько записей.

учтено:

ALTER TRIGGER tr_tbl_Invoice_IIN 
   ON  [tbl_Invoice]
   AFTER INSERT
AS 
BEGIN
	DECLARE @ID uniqueidentifier, @NewNumber int,
		@Number nvarchar(250), @NumberMask varchar(10)
 
SET NOCOUNT ON;
 
DECLARE  c_Invoices CURSOR FOR
  select [ID], [InvoiceNumber] from inserted
 
OPEN  c_Invoices
  WHILE 1 = 1
  BEGIN 
    FETCH c_Invoices
     INTO @ID, @Number
 
     IF @@fetch_status = -1 BREAK 
     IF @@fetch_status = -2 CONTINUE 
 
    if (@Number is null)
    begin
	set @NumberMask = ( select [StringValue] from [tbl_SystemSetting] where [Code] = 'InvoiceMask' )
	set @NewNumber = ( select [IntegerValue] +1 from [tbl_SystemSetting] where [Code] = 'InvoiceNumber' )
	set @Number = REPLACE(@NumberMask, '%1', @NewNumber) 
	update [tbl_SystemSetting] set [IntegerValue] = @NewNumber where [Code] = 'InvoiceNumber'
	update [tbl_Invoice] set [InvoiceNumber] = @Number where [ID] = @ID
    end
   END  
CLOSE c_Invoices
DEALLOCATE c_Invoices
 
END
GO

"Осауленко Александр" написал:Можно эту логику и в триггер вынести. Но тогда немного рассредоточится логика по формированию номера: и в конфигурации, и в триггере. Неудобно будет сопровождать.

Не нарушена, все из системных настроек :)

--
Cogito, ergo sum

"Underscore a.k.a. _" написал:
А чем показывать в общем случае неправильный номер лучше, чем нек показывать его вообще.

Я почти на 100% уверен, что такая ситуация будет очень редко, да еще и пользователь на это обратит внимание в 1 случае из 1000. Т.е. почти не реально :)

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

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

А "дырки" в такой нумерации - это практически неизбежное зло

"Владимир Соколов" написал:Обычно это решается созданием отдельной таблицы с хранением последнего номера. И генерацией номера в нужный момент (в момент создания счета или при сохранении - в зависимости от логики).

Владимир, я ничего не придумывал, просто использовал стандартную нумерацию счетов, которая:
1. хранит последний номер в таблице системных настроек
2. генерит номер при сохранении
:)

Все что нужно было, так это перенести логику со скриптов на уровень СУБД... Так и сделал!

--
Cogito, ergo sum

"Виталий Ковалишин aka samael" написал:

ALTER TRIGGER tr_tbl_Invoice_IIN
   ON  [tbl_Invoice]
   AFTER INSERT
AS
BEGIN
        DECLARE @ID uniqueidentifier, @NewNumber int,
...


Я бы еще добавил условие для репликации, даже если у Вас пока ее и нет, что бы потом не "шерстить" БД:

ALTER TRIGGER tr_tbl_Invoice_IIN
   ON  [tbl_Invoice]
   AFTER INSERT
AS
BEGIN
        IF (SYSTEM_USER = 'TS_REPLICATION') RETURN 
        DECLARE @ID uniqueidentifier, @NewNumber int,
...

Спасибо, Александр!

Тогда данное условие нужно во все новые триггеры добавить

IF (SYSTEM_USER = 'TS_REPLICATION') RETURN 

--
Cogito, ergo sum

Здравствуйте! В очередной раз поражаюсь возможностям T-SQL:

"Виталий Ковалишин aka samael" написал:

...
SET @NumberMask = ( SELECT [StringValue] FROM [tbl_SystemSetting] WHERE [Code] = 'InvoiceMask' )
        SET @NewNumber = ( SELECT [IntegerValue] +1 FROM [tbl_SystemSetting] WHERE [Code] = 'InvoiceNumber' )
        SET @Number = REPLACE(@NumberMask, '%1', @NewNumber)
        UPDATE [tbl_SystemSetting] SET [IntegerValue] = @NewNumber WHERE [Code] = 'InvoiceNumber'
UPDATE [tbl_Invoice] SET [InvoiceNumber] = @Number WHERE [ID] = @ID
...

...


Можно заменить на:

...
  UPDATE [tbl_SystemSetting]
  SET
     @Number = (SELECT REPLACE([StringValue], '%1', [IntegerValue] + 1)
                FROM [tbl_SystemSetting] WHERE [Code] = 'InvoiceMask'), 
     [IntegerValue] =  [IntegerValue] + 1
  WHERE [Code] = 'InvoiceNumber'
 
  UPDATE [tbl_Invoice]
  SET
     [InvoiceNumber] = @Number
  WHERE [ID] = @ID
...

Красота!:)

Абсолютно с Вами согласен! :)

--
Cogito, ergo sum

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

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

Впервые настраиваю web-сервисы и возникла следующая проблема:
TerrasoftX25-3.2.0.10, Windows2003server, IIS
Все сделал как написано в Руководстве Администратора, при подключение с удалённой машины, тест проходит успешно, но в списке не видит ни одной конфигурации. Прописал просто вручную - при открытии выдаёт: "Ошибка открытия конфигурации".
Как на сервере создать эту конфигурацию (На сервер обычным методом через MS SQL соединение всё работает), что бы web-сервисы её видели?

Нравится

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

Здравствуйте, Виталий!
Чтобы в раскрывающемся списке появилась Ваша конфигурация, необходимо сначала создать элементы этого списка. Нажмите на лупу, потом кнопку Добавить. Введите название, нажмите кнопку Изменить. Введите пользователя, пароль, сервер и схему - те данные, которые Вы вводили при установке соединения с Windows2003server обычным методом. Нажмите кнопку Тест. Если тест будет успешен, то все в порядке. Такие действия надо проводить на каждой машине, удаленно работающей с базой. Т.е. сначала настраиваете соединение с Windows2003server, а потом с Terrasoft.

Добрый день, похожая проблема.

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

Прошу помощи!

Конфигурацию в настройках web ввожу в ручную, списка нет,

В RunSettings.xml все изменил как надо

<?xml version="1.0" encoding="UTF-8"?>

На локальной машине создал конфигурацию MSSQL: IP,port
в списке она не отобразилась, когда прописал вручную - тоже сообщение об ошибке...

Скажу больше, какие бы конфигурации вручную не вводил - всегда "Тест выполнен успешно"!

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

Изначально хочу заметить, что кнопка «Тест», при настройке конфигурации через веб-сервисы, в отличии от прямого соединения, проверяет наличие данных в строке конфигурация.
Саму же конфигурацию необходимо выбирать из выпадающего списка.

Процедура настройки веб-сервисов имеет ряд нюансов на уровне веб-сервера, рекомендую проверить следующее:

1. Убедитесь что пользователю, обращающемуся к виртуальной директории, разрешено выполнение сценариев и других приложений.
2. Если у Вас ОС Windows Server 2003, то Вам обязательно необходимо предоставить доступ на TSWebServicesServerLibrary.dll в Web Service Extensions.
3. Настроены ли параметры соединения с БД локально.
4. Проверьте доступен ли в IIS сайт по умолчанию, для этого на сервере, в строке браузера введите: http://localhost/

Для полноценного решения проблемы прошу обращаться на support@tscrm.com

Terrasoft Support Team

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

2. Если у Вас ОС Windows Server 2003, то Вам обязательно необходимо предоставить доступ на TSWebServicesServerLibrary.dll в Web Service Extensions.
Предоставлено

3. Настроены ли параметры соединения с БД локально.
Настроено

4. Проверьте доступен ли в IIS сайт по умолчанию, для этого на сервере, в строке браузера введите: http://localhost/
Доступен

Я попробовал ввести в браузере: http://localhost/web/TSWebServicesServerLibrary.dll/soap/IServer
Получил ответ:

  <?xml version="1.0" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
- <SOAP-ENV:Body>
- <SOAP-ENV:Fault>
  <faultactor /> 
  <faultcode>SOAP-ENV:Server</faultcode> 
  <faultstring>XML document must have a top level element. Строка: 0</faultstring> 
  </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

Виталий, попробуйте подключится к Террасофт, используя веб-сервисы, на другом ПК (не сервере) из Вашей локальной сети.

Terrasoft Support Team

Попробовал подключится с другого ПК в локальной сети.
При нажатие на выпадающий список в выборе конфигурации, выдаёт следующую ошибку:

Виталий, выше Вы описали строку соединения, которая настроена на локальный сервер.
Если вы используете данную строку соединения и здесь, то соответственно ответа от сервера Вы не получите.

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

Terrasoft Support Team

http://localhost/web/TSWebServicesServerLibrary.dll/soap/IServer

Я указал для примера.
В реальности вместо "localhost" - IP-адрес сервера, а вместо "web" - реальный виртуальный каталог!
С удалённого ПК я могу подключаться через обычное MSSQL-соединение (ОЧЕНЬ медленно работает)...
В браузере на этом же ПК я вижу:

Добрый день, Виталий

Я сталкнулся с похожими проблемами. Мое решение:

На сервере ISS использовался proxy Kerio, после его отключения все заработало

Спасибо, Павел!
Но я у себя уже пробовал отключать фаервол - не помогло :(

Тогда возникает другой вопрос: "Какие именно порты используются при роботе с веб-сервисами? Только TCP port 80 ?"

Убил я на сервере IIS решил поставить Апач, скачал версию 2.0.61 (из Руководства: "Terrasoft CRM поддерживает работу с Apache версий 2.0-2.0.61"). Апач приходится настраивать не впервые, но после прописания загрузки модуля:

LoadModule tsapache_module "c:\Program Files\Terrasoft CRM X25\Bin\TSWebServicesServerLibrary.dll"  

выдаёт следующею инфу:

Syntax error on line 174 of C:/Program Files/Apache Group/Apache2/conf/httpd.conf:
Can't locate API module structure `tsapache_module' in file C:/Program Files/Terrasoft CRM X25/Bin/TSWebServicesServerLibrary.dll: No error
Note the errors or messages above, and press the <ESC> key to exit.  27...

Что я делаю не так???

Скачал TSCRM(Apache2)_X25_SoftKey_Rus_Firebird.exe оттуда взял TSWebServicesServerLibrary.dll, после чего апач стартовал без ошибок!
Но http://IP/TSWebServicesServerLibrary/soap/IServer тоже не даёт выбрать конфигурацию.
В браузере выдаёт:

З цим XML-файлом не пов’язана ніяка таблиця стилів. Нижче показано дерево елементів.
 
−
<SOAP-ENV:Envelope><SOAP-ENV:Body><SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Stream write error</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Если ввести строкуhttp://IP/TSWebServicesServerLibrary/, вижу такое:

TSWebServicesServerLibrary - Service Info Page
 
 	TSWebServicesServerLibrary - PortTypes:
 
    * IServer [WSDL]
          o Get_ServerConfigurationNames
          o GetDBEngineTypeCode
          o GetIsDBConnected
          o GetServerVersion
          o OpenConfiguration
          o ChangeUserPasswordInDatabase
          o CloseConfiguration
          o StartTransaction
          o CommitTransaction
          o RollBackTransaction
          o ExecuteSQL
          o GetData
          o GetIsDataExists
          o ShowConnectionStringEditForm
          o GetIsTableExists
          o GetIsFieldExists
          o GetDependedTables
          o GetForeignKeysInfo
          o GetIsIndexExists
          o GetIsRelationExists
          o EqualRelations
          o EqualField
          o EqualIndex
          o GetConnectionStringDisplayText
          o GetDatasetBySQLText
          o GetSettingsString
          o GetServerDateTime
          o CreateServerUser
          o DeleteUser
          o GetIsMemberNameValid
          o GetIsServerUserExists
 
 
 
    * IWSDLPublish [WSDL]
       	Lists all the PortTypes published by this Service
          o GetPortTypeList
          o GetWSDLForPortType
          o GetTypeSystemsList
          o GetXSDForTypeSystem
 
 	WSIL:  Link to WS-Inspection document of Services here

Большое спасибо, Александр!

Всё работает!

Здравствуйте, Виталий.

При настройке веб - сервисов под IIS, необходимо было на сервере:

1. Скопировать файл «Configs.xml» из пользовательской директории (пусть по умолчанию «%appdata%\Terrasoft CRM\3.2\Settings\») в директорию Settings (рабочего каталога Terrasoft);
2. В файле RunSettings.xml (находится в папке Settings, рабочего каталога Terrasoft) добавить (изменить, если он есть) параметр:

где «UserSettingsDirectory» - путь к папке Settings (рабочего каталога Terrasoft).

Terrasoft Support Team

Здравствуйте.
Также возникла проблема с настройкой web-сервисов: TerrasoftX25-3.2, WindowsXP. Делала все по инструкции "Руководство Администратора":
1. Скопировала файл Configs.xml из C:\Documents and Settings\папка пользователя\Application Data\Terrasoft CRM\3.2.1\Settings в папку C:\Program Files\Terrasoft CRM X25\Settings, затем в файле RunSettings в атрибуте UserSettingsDirectory прописала путь к папке Settings.
2. Установила IIS
3. Создала виртуальный каталог
4. Прописала URL в окне настроек параметров соединения, конфигурацию из списка выбрать не получается, ввела вручную
При попытке подключения выдается ошибка "Ошибка открытия конфигурации. Разрушительный сбой"
Ввожу в строке браузера http://localhost/ пишет "Не удается найти веб-страницу".

Если в строку браузера введу http://IP компьютера/название виртуальноо каталога/TSWebServicesServerLibrary.dll/soap/IServer, то выдает такую же информацию, о которой писал Ковалишин Виталий 28.08 18.01.

Уже незнаю какие действия предпринять дальше. Помогите пожалуйста решить проблему!

Правильно ли я поняла, что у Ковалишина Виталия все заработало на Апаче или все таки через IIS? И каким образом он решил проблему?

У меня заработало как на Apache2, так и в последствие на IIS.
Делал всё строго по инструкции. У меня проплема была связана с тем, что я не скопировал Configs.xml
Вы создали локально конфигурацию обычным методом, а тогда скопировали файл?

Да создала локально конфигурацию. Я пробовала по-разному: пробовала сначала создавать конфигурацию, а потом копировать файл, также пробовала наоборот сначала копировать файл, а потом создавать кофигурацию. А у вас какая была последовательность действий?
Я думаю может быть я этот файл откуда то не оттуда копирую, ну хотя в инструкции написано, что файл надо копировать из директории данных приложения конкретного пользователя (у меня это C:\Documents and Settings\папка пользователя\Application Data\Terrasoft CRM\3.2.1\Settings). Копирую его в C:\Program Files\Terrasoft CRM X25\Settings, а затем указываю в файле RunSettings в необходимом атрибуте путь к папке Settings(туда куда скопировала файл Configs.xml).
Делала я через IIS.

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

Настроил WEB-сервисы (не первый раз) система TSCRM X25 Firebird 3.2.0.16, Win2003 Server, IIS
Удалённая машина: Vista SP1, TSCRM X25 Firebird 3.2.0.19
Подключаю сервисы, из списка выбираю конфигурацию....
При входе в систему через веб-сервисы, выдает ошибку:
"Ошибка открытия конфигурации. Invalid UTF-8 Encoding."
С той же удалённой машины попробовал напрямую к базе подсоединиться - всё о.к., но медленно... :(
В чём может быть проблема?

Спасибо!

Здравствуйте, Виталий!

Источником данной проблемы могут быть разные бинарные файлы.
На Ваш e-mail была отправлена ссылка, перейдя по которой Вы можете загрузить актуальные бинарные файлы для версии 3.2.0.
Бинарные файлы необходимо обновить как на веб-сервере так и клиентской рабочей станции.

Terrasoft Support Team

Большое спасибо!
Помогло!

Доброго времени суток.
Пытаюсь настроить подключение. В списке конфигураций, конфигурации не появляются.
Файл настроек копировал и путь в RunSettings указывал.
Локально клиент цепляется к существующей конфигурации если напрямую к MSSQL без проблем.

Какой корректный ответ от сервера должен быть, если обращаться по адресу:
http://..../TSWebServicesServerLibrary.dll/soap/IServer
У меня выпадает:

-
-

SOAP-ENV:Server
XML document must have a top level element. Строка: 0

Если обратится по http://..../TSWebServicesServerLibrary.dll, то я так понимаю всё корректно отрабатывает, показывается список методов библиотеки.

Куда копать?
Спасибо.

Здравствуйте, Максим!

При вводе строки [url]http://..../TSWebServicesServerLibrary.dll/soap/IServer[/url] в браузер, корректным ответом считается следующий xml:

 <?xml version="1.0" ?>
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
- <SOAP-ENV:Body>
- <SOAP-ENV:Fault>
  <faultactor />
  <faultcode>SOAP-ENV:Server</faultcode>
  <faultstring>XML document must have a top level element. Строка: 0</faultstring>
  </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

Процедура настройки веб-сервисов имеет ряд нюансов на уровне веб-сервера, рекомендую проверить следующее:

1. Убедитесь что пользователю, обращающемуся к виртуальной директории, разрешено выполнение сценариев и других приложений.
2. Если у Вас ОС Windows Server 2003, то Вам обязательно необходимо предоставить доступ на TSWebServicesServerLibrary.dll в Web Service Extensions.

Terrasoft Support Team

Здравствуйте!
Такая проблема: настраивал веб-сервисы в офисе (выход в интернет через прокси) для проверки. После копирования config.xml все получилось. Попробовал настроить на ноутбуке дома, ничего не выходит. Пишет чтото на подобии "превышен таймаут подключения".
Что это может быть? Делаю все по инструкции. Что не так? Помогите пожалуйста.

Здравствуйте, Игорь!

Для того чтобы проверить работоспособность веб-сервисов рекомендую ввести в адресную строку браузера URL: http://localhost/web/TSWebServicesServerLibrary.dll/soap/IServer,
где localhost — имя ПК, web — название веб-сайта (или виртуальной директории, если используется веб-сайт по умолчанию)

Не совсем понятно, Вы настраиваете дома веб-сервер или пытаетесь подключиться к конфигурации офиса?
Для использования веб-сервисов Вам необходимо минимум 2 ПК. Один из которых выступает в роли веб-сервера, а второй в роли клиента. И именно на втором ПК необходимо тестировать подключение к конфигурации Террасофт через веб-сервисы.

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

Terrasoft Support Team

Добрый день
Настроил веб-сервисы под IIS. В локальной сети строка типа http://192.168.0.16/ts/TSWebServicesServerLibrary.dll/soap/IServer работает отлично.
Теперь хочу настроить, чтобы можно было подключаться через интернет.
Настраиваю такой адрес http://внешний_адрес/ts/TSWebServicesServerLibrary.dll/soap/IServer
Возникли проблемы. Браузер выдает корректный XML-код, можно ходить по папкам и т.д. Но невозможно выбрать конфигурацию -- пишет Access violation at adress 0259A859.
Обе сети защищены Winroute Firewall. Возможно, винроут не пускает какие-либо пакеты, хотя в логах ничего нет, и, как я уже написал, браузер выдает корректный XML-код.
В чем может быть проблема? Винроут отключить невозможно.

Здравствуйте, Евгений!

В данном случае могу порекомендовать использовать явный TCP-порт для доступа к конфигурации.
Указав этот порт, как исключение в Winroute Firewall и настроив доступ к веб-сайту или виртуальный каталогу через этот порт.

Соответственно строка соединения должна иметь следующий вид:
http://внешний_адрес:порт/ts/TSWebServicesServerLibrary.dll/soap/IServer

Terrasoft Support Team

Владимир, к сожалению, такой фокус тоже не прошел.
Может открыть еще какие-либо порты?

Для доступа к конфигурации через веб-сервисы достаточно использовать соединение по 1-му порту.
Евгений, Вы уверены что выбранный Вами порт открыт? telnet [host [port]] с клиентского ПК проходит?

Terrasoft Support Team

Владимир, я уверен. Телнет и браузер нормально работают, пинги ходят. Даже брандмауэр отключил на клиентском ПК

Здравствуйте, Евгений!

В таком случае могу порекомендовать следующее:

1. Перезапустить IIS;
2. Если у Вас ОС Windows Server 2003, то Вам обязательно необходимо предоставить доступ на TSWebServicesServerLibrary.dll в Web Service Extensions;

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

Terrasoft Support Team

1. IIS перезапустил
2. Еще раз проверил разрешения для dll
3. Вот что выдает браузер на клиенте

  <?xml version="1.0" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
- <SOAP-ENV:Body>
- <SOAP-ENV:Fault>
  <faultactor /> 
  <faultcode>SOAP-ENV:Server</faultcode> 
  <faultstring>Для документа XML должен существовать документ более высокого уровня. Строка: 0</faultstring> 
  </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

4. Что характерно, настроил через MS-SQL-протокол -- работает. Причем очень даже неплохо. Но жрет много трафика
5. Возможно, проблема в том, что клиент, где установлен ТС, работает под 2003R2 ?

Спасибо, за дополнительную информацию!

По 5-му пункту — вполне возможно.
Существует ли возможность попробовать подключиться с ПК, где установлена ОС Windows XP SP2 или SP3?

Terrasoft Support Team

Приветствую всех
Проблема, как я и думал, была в нежелании работать ТС в среде WIN2003R2х86 c 8Гб памяти и включенным ПАЕ. На системах с ХР все заработало нормально, правда медленно, в отличие от работы через SQL-порты.
Возможно как-то ускорить работу через веб-сервисы (покрутить скорость/сжатие)?

Здравствуйте, Евгений!

Могу порекомендовать Вам следующее:
1. Увеличить пропускную способность канала максимально позволяющую провайдером;
2. Установить минимальный уровень сжатия данных или же вообще отключить его (Без сжатия).

Terrasoft Support Team

Здравствуйте, Владимир
А как лучше сделать доступ:
1. Терминальные клиенты через итернет в нашу локалку
2. Терминальные клиенты на локальный сервер и веб-доступ к нашей сети
3. Чистый веб-доступ у каждого удаленного клиента

Возможно пункты 2 и 3 мало чем отличаются, но интересен момент производительности и пожирания трафика между RDP и веб-сервисом.

Евгений, вариант удаленного использования программного продукта Террасофт следует выбирать в зависимости от:

- конфигурации аппаратного обеспечения серверов;
- пропускной способности и стабильности канала доступа к интернету;
- общая критичность/стоимость вышеперечисленных пунктов.

Если Вы сможете более подробно описать предполагаемую архитектуру и схему доступа, мы сможем Вам порекомендовать, что-то конкретизированное.

Учитывая, что данная тема больше относиться к архитектуре удаленного доступа нежели к проблемам с веб-сервисами, предлагаю обсудить её в отдельной теме или же в переписке с support@tscrm.com.

Terrasoft Support Team

День добрый.
Есть удаленный Пользователь не входящий в локальную сеть, где расположен сервер. Подключается к базе через web-сервис. При попытке выбора конфигурации выдает ошибку (см. скриншот).
В локальной сети работа через web-сервисы проходит отлично.
Во всех случаях Сервер URL - http://IPадрес_сервера/имя_виртуального_каталога/TSWebServicesServerLibrary.dll/soap/IServer
Каким образом удаленному пользователю (не входящему в локальную сеть), обращающемуся к виртуальной директории, разрешить выполнение сценариев и других приложений?
В управлении безопасностью виртуального каталога (в IIS) установлен анонимный доступ.

"Вадим" написал:В локальной сети работа через web-сервисы проходит отлично.
Во всех случаях Сервер URL - http://IPадрес_сервера/имя_виртуального_каталога/TSWebServicesServerLibrary.dll/soap/IServer

Здравствуйте, Вадим!

Уточните пожалуйста, IPадрес_сервера - локальный IP адрес сервера? 192.168.х.х или 10.х.х.х ?

--
γνῶθι σεαυτόν

213.221.6.93

У Вас проблема с настройками FireWall-а, он не пускает на HTTP и HTTPS порты:

 nmap  -P0 -p 80,443  213.221.6.93
 
Starting Nmap 4.11 at 2009-05-20 11:01 EEST
Interesting ports on 213.221.6.93:
 
PORT    STATE    SERVICE
80/tcp  filtered http
443/tcp filtered https
 
Nmap finished: 1 IP address (1 host up) scanned in 3.058 seconds

--
www.it-sfera.com.ua
Terrasoft Solution Partner

там стоит доступ по конкретным IP адресам, с которых заходит удаленный пользователь

"Вадим" написал:там стоит доступ по конкретным IP адресам, с которых заходит удаленный пользователь

С его ПК можно законнектиться на 80 порт?

--
www.it-sfera.com.ua
Terrasoft Solution Partner

С ПК пользователя, на его же 80 порт? Ну да, инет доступен.

Нет, с ПК пользователя на 80 порт сервера?
К примеру: telnet 213.221.6.93 80

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Вадим, Виталий, здравствуйте!

"Виталий Ковалишин aka samael" написал:
С его ПК можно законнектиться на 80 порт?

Я бы не рекомендовал использовать 80-й порт. Из соображений безопасности доступа к конфигурации. Попробуйте, например, 8081. Убедитесь, что этот порт открыт для доступа на сервере и telnet 213.221.6.93 8081 успешно проходит с клиента.

Здравствуйте, Владимир!

"Присяжнюк Владимир" написал:Я бы не рекомендовал использовать 80-й порт. Из соображений безопасности доступа к конфигурации. Попробуйте, например, 8081. Убедитесь, что этот порт открыт для доступа на сервере и telnet 213.221.6.93 8081 успешно проходит с клиента.

Изменение номера TCP порта не гарантия безопасности! Берем сетевой сканер (тот же nmap) и смотрим, что открыто :).
У Вадима на сервере и так стоит фильтрация по адресам:

"Вадим" написал:там стоит доступ по конкретным IP адресам, с которых заходит удаленный пользователь

Читал когда-то в одной книге по безопасности сетей: безопасный компьютер – это компьютер отключен от сети, от сети питания и стоит в углу комнаты ;)
Мое субъективное мнение, что Windows с реальным IP адресом – это уже не безопасно!

В нашей компании реализовано следующим образом:

  • на входе шлюз (FreeBSD, где настроен межсетевой экран, маршрутизация и прокси)
  • Windows Server с TerrasoftCRM стоит в локальной сети
  • На шлюзе прописан port mapping : все входящие запросы на 81 порт прокидываться на 80 порт «серой айпишки» Windows Server с TerrasoftCRM
  • Межсетевой экран принимает запросы на 81 порт только с ограниченного числа внешних IP

Так безопасней :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Виталий Ковалишин aka samael" написал:У Вадима на сервере и так стоит фильтрация по адресам:

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

"Виталий Ковалишин aka samael" написал:В нашей компании реализовано следующим образом:

* на входе шлюз (FreeBSD, где настроен межсетевой экран, маршрутизация и прокси)
* Windows Server с TerrasoftCRM стоит в локальной сети
* На шлюзе прописан port mapping : все входящие запросы на 81 порт прокидываться на 80 порт «серой айпишки» Windows Server с TerrasoftCRM
* Межсетевой экран принимает запросы на 81 порт только с ограниченного числа внешних IP

Так безопасней :)


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

Terrasoft Support Team

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