Анонимность web сервиса
Добрый день.
Пытаюсь сделать анонимный 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…
Правильно?
