Есть БП, в котором в элементе "Сценарий" получается локализованный шаблон 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.
Кто сталкивался с подобной проблемой в фоновых БП и как её можно решить?
Схемы
Нравится
Игорь, привет! Я бы забил на галочку, больше потеряешь времени и нервов на поиски) Проще просто вручную обернуть действие с помощью Task.Factory.StartNew, если нужно без блокировки потока. Правда, отслеживать и логировать, если что-то в helper'e пойдет не так, придется вручную, т.к. всегда будешь получать в процессе "ок"
Не знаю, как сейчас, но когда-то для перевода в фоновый режим достаточно было поставить ожидание по таймеру 1 сек
Сейчас достаточно поставить галочку "Выполнять следующие элементы в фоновом режиме"
Но при этом такое поведение базовой логики
Мотков Илья пишет:
Такое ещё может быть, если вызывается по таймеру БП с генерацией печатной формы.
Часть кода в сервисах генерации печатных форм не умеют так работать.
См. обсуждения: 1, 2, 3 и 4.В этих темах предлагаются разные доработки и обходные варианты получения UserConnection.
Так в том то и дело, что в рамках своего класса я передаю UserConnection.
А в базовом веб-сервисе MacrosHelperService.GetMultiLanguageTextTemplate при вызове
MLangContentFactory.GetContentKit в конструктор класса MLangContentFactory оно не передается.
Значит, базовый класс не предусматривает такой передачи UserConnection и нужно делать свой доработанный, как поступали с сервисом печатных форм в примерах по ссылкам.
Лопатин Константин Николаевич пишет:
Игорь, привет! Я бы забил на галочку, больше потеряешь времени и нервов на поиски) Проще просто вручную обернуть действие с помощью Task.Factory.StartNew, если нужно без блокировки потока. Правда, отслеживать и логировать, если что-то в helper'e пойдет не так, придется вручную, т.к. всегда будешь получать в процессе "ок"
Task.Factory.StartNew не помог.