Вопрос

Проблема с исходным кодом

Здравсвуйте! Есть некоторая проблема с написанным мной исходным кодом.
При запуске Бизнес-процесса при получении сигнала от объекта или таймера, где в задании сценарии вызывается вебсервис и метод без передачи параметров(плюс вдобавок это метод void), вызывается такая ошибка:
System.ServiceModel.ServiceActivationException: Set AspNetCompatibilityEnabled true
   в Terrasoft.Web.Common.BaseService.get_UserConnection()
   в Terrasoft.Configuration.WebService1C.UpdatesBankNameAndAdresAll()
   в Terrasoft.Core.Process.qrtProcess_f3c9148MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
Хотя при ручном запуске все работает нормально, как ее можно исправить?

Нравится

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

Возможно не передается UserConnection, добавь в БП
var userConnection = Get<UserConnection>("UserConnection");
WebService1C service = new WebService1C(userConnection);

 

а, в схему добавь:

public UserConnection UserConnection {
            get;
            private set;
        }
        

        public WebService1C(UserConnection userConnection) {
            UserConnection = userConnection;
        }

Вызываю вебсервис и метод так:
WebService1C service = new WebService1C();
service.UpdatesBankNameAndAdresAll();
return true;

Самое примечательное, что, если добавить перед запуском элемент "Вопрос пользователю" и добавить ответ положительный, а также ответить на него при вызове сигнала  от объекта или таймера или добавить элемент "Автогенирируемая страница", то все также работает нормально.

Также когда вебсервис и метод вызывается в коде джаваскрипта при помощи SrrviceHelper, тоже все работает нормально.

Вот код метода:

[OperationContract]
        [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped,
            RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public void UpdatesBankNameAndAdresAll() {
            
            string guid1cBank = "";
            Guid id = new Guid();
            
            var esqBank = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "AccountBillingInfo");
            esqBank.AddAllSchemaColumns();
            var banks = esqBank.GetEntityCollection(UserConnection);
            foreach (var bankItem in banks) {
                guid1cBank = bankItem.GetTypedColumnValue<string>("qrtGuid1cBank");
                id = bankItem.GetTypedColumnValue<Guid>("Id");
                if(guid1cBank != String.Empty){
                    UpdatesBankNameAndAdresOne(id);
                }
            }
        }

Возможно не передается UserConnection, добавь в БП
var userConnection = Get<UserConnection>("UserConnection");
WebService1C service = new WebService1C(userConnection);

 

а, в схему добавь:

public UserConnection UserConnection {
            get;
            private set;
        }
        

        public WebService1C(UserConnection userConnection) {
            UserConnection = userConnection;
        }

Да, вы правы, но частично
Вот что надо добавить в веб-сервис, чтобы можно было его использовать(вызывать в коде Js и БП) нормально:

 

    public WebService1C() {}
        
        public WebService1C(UserConnection userConnection) {
            this._userConnection = userConnection;
        }
        
        private UserConnection _userConnection;
        protected UserConnection UserConnection {
            get {
                if (_userConnection != null) {
                    return _userConnection;
                }
                _userConnection = CurrentHttpContext.Session ["UserConnection"] as UserConnection;
                if (_userConnection != null) {
                    return _userConnection;
                }
                var appConnection = (AppConnection)CurrentHttpContext.Application ["AppConnection"];
                _userConnection = appConnection.SystemUserConnection;
                return _userConnection;
            }
        }
        
        private HttpContextBase _httpContext;
        protected virtual HttpContextBase CurrentHttpContext {
            get { return _httpContext ?? (_httpContext = new HttpContextWrapper (HttpContext.Current)); }
            set { _httpContext = value; }
        }

 

в Using прописано это:
 

using System;
    using System.Configuration;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Common;
    using Terrasoft.Core;
    using Terrasoft.Core.Entities;
    using Terrasoft.Web.Common;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    using System.Collections.ObjectModel;
    using System.Data;
    using Newtonsoft.Json;
    using Terrasoft.Core.DB;
    using System.Runtime.Serialization;

Атюкин Егор Эдуардович,

прочитайте про веб сервисы здесь 

Описанное Вами выше поведение говорит о том, что если процесс минует пользователя, то UserConnection отсутствует в текущем контексте

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