Добрый день.
Пытаюсь сделать анонимный web-service.
namespace Terrasoft.Configuration { using System; using System.IO; using System.Net; using System.Collections.Generic; using Terrasoft.Common; using Terrasoft.Core.Entities; using Terrasoft.Core; using Terrasoft.Core.Process; using Terrasoft.Core.Process.Configuration; using Newtonsoft.Json; 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 MeServiceTest : BaseService { [OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] public void ImportData(string name, string description) { Insert ins = new Insert(UserConnection) .Into("Test") .Set("Name", Column.Parameter(name)) .Set("Description", Column.Parameter(description)); ins.Execute(); } } }
Не понимаю где и как нужно вызвать
SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser);
Надеюсь на Вашу помощь.
Нравится
В методе OperationContract перед Insert.
И у вас не будет UserConnection.
Получите его из httpContext и используйте uc вместо UserConnection.
Пример:
var httpContext = HttpContextAccessor.GetInstance();
var uc = ((AppConnection)httpContext.Application["AppConnection"]).SystemUserConnection;
SessionHelper.SpecifyWebOperationIdentity(httpContext, uc.CurrentUser);
OLeg1020,
У вас какая версия Creatio? Судя по виду конфигурации на скриншоте, версия у вас до 7.17.0. Свойство HttpContextAccessor в базовом сервисе появилось где-то в 7.15, если правильно помню. В старых версиях нужно использовать HttpContext.Current.
OLeg1020,
Глянул в документацию версии 7.14, всё-таки там есть HttpContextAccessor. У меня щас нет возможности протестить, проверьте пожалуйста следующее: верните HttpContextAccessor.GetInstance(), только вместо пространства имён Terrasoft.Web.Http.Abstractions подключите System.Web. Отпишитесь о результатах.
OLeg1020,
А хотя там в принципе не нужны ни Terrasoft.Web.Http.Abstractions, ни System.Web.
HttpContextAccessor же свойство из BaseService. Странно, что изначально не компилировалось. А CurrentUser можно получить так: AppConnection.SystemUserConnection.CurrentUser.
OLeg1020 пишет:
Оффтоп - поделитесь найденным решением, пожалуйста: https://community.terrasoft.ru/questions/rabota-s-web-service
OLeg1020,
Я думаю, что вам можно обойтись без SessionHelper.SpecifyWebOperationIdentity. Достаточно будет в Insert запрос передавать не UserConnection, а AppConnection.SystemUserConnection.
Насколько я понял, SpecifyWebOperationIdentity нужен в анонимном веб-сервисе для правильной работы бизнес-процессов, которые будете вызывать вручную кодом, либо событийных процессов объекта, которые могут вызваться после Entity.Save. Не знаю, какие могут быть проблемы в этих процессах - мне никогда не приходилось сталкиваться. У вас только вставка записи в бд через класс Insert, поэтому проблем быть не должно.
OLeg1020,
Я наверное не правильно сформулировал свою мысль, извиняюсь. Метод нужен для бизнес процессов, вызванных из анонимного сервиса, а не для самого сервиса. В моём опыте создания анонимных сервисов SessionHelper.SpecifyWebOperationIdentity не нужен был - без него всё хорошо работало.
Vyacheslav Lipatkin,
Да вот не хочет.
Прописано в services.config
<service name="Terrasoft.Configuration.MeServiceTest"> <endpoint name="MeServiceTestEndPoint" address="" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="Terrasoft.Configuration.MeServiceTest" /> </service>
Добавлено в web.config
<location path="ServiceModel/MeServiceTest.svc"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> ... <add key="AllowedLocations" value="ServiceModel/MsgUtilService.svc;Nui/Feedback.aspx;Nui/UserManagement.aspx;ServiceModel/GeneratedWebFormService.svc;ServiceModel/ExchangeListenerService.svc;TestTools/Tests.aspx;TestTools/Tests.Debug.aspx;TestTools/Tests.Release.aspx;ServiceModel/TestDataService.svc;ServiceModel/CaseRatingManagementService.svc;ServiceModel/MandrillService.svc;ServiceModel/EventTrackingService.svc;TestTools/UnitTests.aspx;ServiceModel/ScoringService.svc;ServiceModel/CESWebHooksService.svc;ServiceModel/CESTroubleshootingService.svc;ServiceModel/GeneratedObjectWebFormService.svc;ServiceModel/BsoJivosite.svc;ServiceModel/BsoTilda.svc;ServiceModel/DocumentsService.svc;ServiceModel/PtOauthService.svc;ServiceModel/AletMangoCloudConnector.svc;ServiceModel/ScriptDesignerService.svc;ServiceModel/FacebookWebhookService.svc;Features.aspx;ServiceModel/OpChatraWebhook.svc;ServiceModel/OPMyCallsUtils.svc;/ServiceModel/ServiceOAuthAuthenticatorEndpoint.svc;ServiceModel/MeServiceTest.svc" />
Что я делаю не так?
С авторизацией срабатывает.
Рабочий пример 7.14
// Пользовательское пространство имен. namespace Terrasoft.Configuration.UsrCustomConfigurationService //SystemUserConnection { using System; using System.ServiceModel; using System.ServiceModel.Web; using System.ServiceModel.Activation; using Terrasoft.Core; using Terrasoft.Web.Common; using Terrasoft.Core.Entities; using Terrasoft.Core.DB; [ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class UsrCustomConfigurationService: BaseService { // Ссылка на экземпляр UserConnection, требуемый для обращения к базе данных. private SystemUserConnection _systemUserConnection; private SystemUserConnection SystemUserConnection { get { return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection); } } // Метод, возвращающий идентификатор контакта по его имени. [OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] public void GetContactIdByName(string name, string description){ Insert ins = new Insert(SystemUserConnection) .Into("Test") .Set("Name", Column.Parameter(name)) .Set("Description", Column.Parameter(description)); ins.Execute(); } } }
+ настройки в конфигах из статьи
https://academy.terrasoft.ru/documents/technic-sdk/7-16/sozdanie-anonim…