Есть БП, в котором в элементе "Сценарий" получается локализованный шаблон Email c помощью конструкции:

MacrosHelperServiceRequest request = new MacrosHelperServiceRequest();
request.EntityId = activeRowId;
request.TemplateId = emailTemplateId;
request.EntityName = entityName;
 
var macrosHelperService = new MacrosHelperService(new GlobalMacrosHelper(), _uc);
MacrosHelperServiceResponse result = macrosHelperService.GetMultiLanguageTextTemplate(request);

Шаблон формируется.

НО только если не стоит галочка  "Выполнять следующие элементы в фоновом режиме"

Если галочка стоит, то получаем ошибку в журнале БП:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в Terrasoft.WebApp.Global.<>c.<WorkspaceDependenciesInitializer>b__24_0(IContext context)
   в Ninject.Activation.Provider`1.Create(IContext context)
   в Ninject.Activation.Context.ResolveInternal(Object scope)
   в Ninject.Activation.Context.Resolve()
   в Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   в Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
   в Ninject.Activation.Provider`1.Create(IContext context)
   в Ninject.Activation.Context.ResolveInternal(Object scope)
   в Ninject.Activation.Context.Resolve()
   в Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   в Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)
   в System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   в System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   в System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   в Ninject.Activation.Providers.StandardProvider.Create(IContext context)
   в Ninject.Activation.Context.ResolveInternal(Object scope)
   в Ninject.Activation.Context.Resolve()
   в Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   в Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, String name, IParameter[] parameters)
   в Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   в Terrasoft.Configuration.MLangContentFactory.GetDefaultIterator(String schemaName)
   в Terrasoft.Configuration.MLangContentFactory.GetContentKit(String iteratorTagName, String storeTagName)
   в Terrasoft.Configuration.MacrosHelperService.GetMultiLanguageTextTemplate(MacrosHelperServiceRequest request)



Есть подозрение на отсутствие UserConnection при фоновом режиме вызова.

Т.к. при вызове виртуального метода  MLangContentFactory.GetContentKit (в MacrosHelperService.GetMultiLanguageTextTemplate) в конструктор объекта MLangContentFactory не передается UserConnection.



Кто сталкивался с подобной проблемой в фоновых БП и как её можно решить?

Схемы 

Нравится

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

Игорь, привет! Я бы забил на галочку, больше потеряешь времени и нервов на поиски) Проще просто вручную обернуть действие с помощью Task.Factory.StartNew, если нужно без блокировки потока. Правда, отслеживать и логировать, если что-то в helper'e пойдет не так, придется вручную, т.к. всегда будешь получать в процессе "ок"

Не знаю, как сейчас, но когда-то для перевода в фоновый режим достаточно было поставить ожидание по таймеру 1 сек

Сейчас достаточно поставить галочку "Выполнять следующие элементы в фоновом режиме"

Но при этом такое поведение базовой логики

Такое ещё может быть, если вызывается по таймеру БП с генерацией печатной формы.

Часть кода в сервисах генерации печатных форм не умеют так работать.

См. обсуждения: 1, 2, 3 и 4.

В этих темах предлагаются разные доработки и обходные варианты получения UserConnection.

Мотков Илья пишет:

Такое ещё может быть, если вызывается по таймеру БП с генерацией печатной формы.

Часть кода в сервисах генерации печатных форм не умеют так работать.

См. обсуждения: 1, 2, 3 и 4.

В этих темах предлагаются разные доработки и обходные варианты получения UserConnection.

Так в том то и дело, что в рамках своего класса я передаю UserConnection.

А в базовом веб-сервисе MacrosHelperService.GetMultiLanguageTextTemplate при вызове 

MLangContentFactory.GetContentKit в конструктор класса MLangContentFactory оно не передается.

Значит, базовый класс не предусматривает такой передачи UserConnection и нужно делать свой доработанный, как поступали с сервисом печатных форм в примерах по ссылкам.

Лопатин Константин Николаевич пишет:

Игорь, привет! Я бы забил на галочку, больше потеряешь времени и нервов на поиски) Проще просто вручную обернуть действие с помощью Task.Factory.StartNew, если нужно без блокировки потока. Правда, отслеживать и логировать, если что-то в helper'e пойдет не так, придется вручную, т.к. всегда будешь получать в процессе "ок"

 Task.Factory.StartNew не помог.

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