Реализую интеграцию по протоколу Soap.

dotnet-svcutil на основании wsdl сформировал proxy-класс.

ряд элементов proxy-класс ссылаются на  компоненты библиотеки System.ServiceModel.Primitives.dll, которой нет в dotnetcore приложении.

Пример ошибки:  

error CS0246: The type or namespace name 'IsWrapped' could not be found (are you missing a using directive or an assembly reference?)



После импорта System.ServiceModel.Primitives.dll при компиляции появляется ошибка вида:

 

​​​​​​​error CS0433: The type 'ServiceContractAttribute' exists in both 'System.ServiceModel.Primitives, Version=4.2.0.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Terrasoft.ServiceModel.Primitives, Version=1.0.0.0, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879' [w:\BPMOnline\www\rzd_core\Terrasoft.Configuration\Terrasoft.Configuration.Dev.csproj]



В  приложении на dotNetframework ошибка не повторяется.

​​​​​​​Дополнительно проанализировал структуру проекта на dotNetFramework и выявил, что TERRASOFT.SERVICEMODEL.PRIMITIVES на данной платформе отсутствует (используется аналог Terrasoft.Services), а System.ServiceModel.Primitives наоборот присутствует.

Каким образом мне портировать библиотеку System.ServiceModel.Primitives.dll без конфликта с классами ядра creatio?

Нравится

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

Добрый день. 



WCF является технологией которая встроена в .net Framework. Наше приложение на .net Framework использовало технологию  WCF для доступа к конфигурационным сервисам. В тот момент когда мы переводили наш продукт на .net Core в нем WCF не было. По этому нам пришлось написать собственную абстракцию Terrasoft.ServiceModel.Primitives, которая дала бы возможность минимально переделать код конфигурации, как собственный, так и клиентов, чтобы он заработал в .net Core. Наша конфигурация и кастомизации наших клиентов использовали огромное количество using System.ServiceModel и имен классов из этого пространства имен. Чтобы наши пакеты, и самое важное, пакеты партнеров и клиентов были максимально легко адаптированными к .net Core, Terrasoft.ServiceModel.Primitives содержит тоже пространство имен и те же имена классов(но не всех), что и  System.ServiceModel.Primitives. Поэтому Terrasoft.ServiceModel.Primitives не совместима с System.ServiceModel.Primitives и Вам не удастся использовать ее в нашем приложении на .net Core.

 

Не было цели в  Terrasoft.ServiceModel.Primitives, поместить все классы из System.ServiceModel.Primitives, туда были помещены, только те которые использовались в конфигурации и то не все. У Вас прокси класс работать не будет, т.к. наше приложение на .net Core WCF не поддерживает. 

 

Рекомендуем Вам использовать наши сервисы, которые REST ориентированные, без WCF. 

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

Возникла проблема с вызовом веб-сервиса из студии.  Возвращает ошибку 404. Пример сервиса:

 namespace Terrasoft.Configuration
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Core.DB;
    using Terrasoft.Web.Common;
 
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UpsertContactService : BaseService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string GetTransformValue(string inputParam)
        {
            // Изменение значения входящего параметра.
            var result = inputParam + " changed!";
            return result;
        }
    }
}

Пример вызова:

HttpWebResponse authresponse = (HttpWebResponse)authRequest.GetResponse();
            var myRequest = HttpWebRequest.Create("https://мой сайт/0/ServiceModel/UpsertContactService.svc/GetTransformValue") as HttpWebRequest;
 
            myRequest.Method = "POST";
            myRequest.ContentType = "application/json";
            foreach (Cookie Cook in authresponse.Cookies)
            {
                myRequest.Headers.Add(Cook.Name, Cook.Value);
            }
            myRequest.CookieContainer = bpmCookieContainer;
 
            using (var requestStream = myRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requestStream))
                {
                    writer.Write(@"111");
                }
            }
            using (HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse())
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                {
                    string s = reader.ReadToEnd();
                    Console.WriteLine(s);
                }
            }

Авторизация проходит успешно, БП получилось запустить. Как запустить сервис и получить от него ответ?

Нравится

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

Добрый день

Виталий, в статье на академии есть ответ https://academy.terrasoft.ru/docs/developer/back-end_development/config…

 

Ответ 404 верный, т.к. у вас нет такого сервиса. Вы создаете конфигурационный сервис, который вызывается по другому url.

 

А зачем в Header добавлять значения всех кук из аутентификации? Достаточно только BPMCSRF.

Во-вторых. Вызов под каким пользователем происходит? под портальным? Если да, то надо сервис добавить в список разрешенных для портальных - \папка приложения\Terrasoft.WebApp\SspServices\SspServiceList.txt

Добавить комментарий

Алексей Следь,

происходит под админом, сайт в облаке, через постмен тоже 404.

Вот что в браузере пишет:

Добрый день

Виталий, в статье на академии есть ответ https://academy.terrasoft.ru/docs/developer/back-end_development/config…

 

Ответ 404 верный, т.к. у вас нет такого сервиса. Вы создаете конфигурационный сервис, который вызывается по другому url.

 

Артем Гура,

Да! То что нужно! Вот рабочий код:

HttpWebResponse authresponse = (HttpWebResponse)authRequest.GetResponse();
            var myRequest = HttpWebRequest.Create("https://mysite.com/0/rest/UpsertContactService/GetTransformValue") as HttpWebRequest;
 
            myRequest.Method = "POST";
            myRequest.ContentType = "application/json";
            myRequest.Headers.Add(authresponse.Cookies["BPMCSRF"].Name, authresponse.Cookies["BPMCSRF"].Value);
            myRequest.CookieContainer = bpmCookieContainer;
 
            using (var requestStream = myRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requestStream))
                {
                    writer.Write(@"{""inputParam"":""Test!""}");
                }
            }
            using (HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse())
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                {
                    string s = reader.ReadToEnd();
                    Console.WriteLine(s);
                }
            }

И еще как авторизовался, может кому нужно будет:

var authRequest = HttpWebRequest.Create(@"https://mysite.com/ServiceModel/AuthService.svc/Login") as HttpWebRequest;
            authRequest.Method = "POST";
            authRequest.ContentType = "application/json";
            var bpmCookieContainer = new CookieContainer();
            authRequest.CookieContainer = bpmCookieContainer;
            using (var requestStream = authRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requestStream))
                {
                    writer.Write(@"{
                                ""UserName"":""Supervisor"",
                                ""UserPassword"":""Supervisor"",
                                ""SolutionName"":""TSBpm"",
                                ""TimeZoneOffset"":-120,
                                ""Language"":""Ru-ru""
                                }");
                }
            }

 

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

Здравствуйте.
Подскажите, пожалуйста, как можно решить проблему с веб-сервисом в bpmonline 5.4.
При компиляции ошибки: "Имя типа или пространства имен "ServiceModel" отсутствует в пространстве имен "System" (пропущена ссылка на сборку?)"
И соответственно: "Не удалось найти имя типа или пространства имен "ServiceContract" (пропущена директива using или ссылка на сборку?)"
Не использую EntityDataService.svc, так как нужен сервис, доступный без авторизации.

Нравится

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

Елена, возможно, Вы что-то неправильно заполнили в Using нового сервиса. См. как написан любой готовый сервис в конфигурации, например, CardService в коробке Loyalty 5.3.
Также см. статью.

Александр, спасибо. Помогло копирование библиотек в папку bin и добавление ссылок.

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