Вопрос

Анонимность 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);

 
Надеюсь на Вашу помощь.

Нравится

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

В методе OperationContract перед Insert.
И у вас не будет UserConnection. 
Получите его из httpContext и используйте uc вместо UserConnection. 
Пример:
var httpContext = HttpContextAccessor.GetInstance();
            var uc = ((AppConnection)httpContext.Application["AppConnection"]).SystemUserConnection;            
            SessionHelper.SpecifyWebOperationIdentity(httpContext, uc.CurrentUser); 

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

Правильно?
Получаю ошибку

using Terrasoft.Web.Http.Abstractions;

 

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

Добавлено, но ошибка та же

OLeg1020,

У вас какая версия Creatio? Судя по виду конфигурации на скриншоте, версия у вас до 7.17.0. Свойство HttpContextAccessor в базовом сервисе появилось где-то в 7.15, если правильно помню. В старых версиях нужно использовать HttpContext.Current.

Vyacheslav Lipatkin,

7.14

Vyacheslav Lipatkin,

Пробовал и так, но опять с ошибкой.

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 

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

Vyacheslav Lipatkin,

И какие могут быть варианты решения?
Честно говоря, уже немного надоело натыкатать на "странности", вроде как должно работать, но не хочет... То ли нам досталась такая среда....

OLeg1020,

Я думаю, что вам можно обойтись без SessionHelper.SpecifyWebOperationIdentity. Достаточно будет в Insert запрос передавать не UserConnection, а AppConnection.SystemUserConnection.

 

Насколько я понял, SpecifyWebOperationIdentity нужен в анонимном веб-сервисе для правильной работы бизнес-процессов, которые будете вызывать вручную кодом, либо событийных процессов объекта, которые могут вызваться после Entity.Save. Не знаю, какие могут быть проблемы в этих процессах - мне никогда не приходилось сталкиваться. У вас только вставка записи в бд через класс Insert, поэтому проблем быть не должно.

Vyacheslav Lipatkin,

Так мне и надо сделать анонимный, в том-то и дело.
Просто как сервис, всё работает.

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…

 

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