Доступ к конфигурации из системы событий при запуске через базовую услугу


19

Имея немного проблем с системой событий при запуске события через основную услугу.

У нас есть компоненты, сохраненные в публикации, которую мы должны скопировать в другую публикацию в том же экземпляре Tridion. Эти компоненты сохраняются из отдельного приложения, которое использует основную услугу.

Итак, вкратце: Создать/обновить компонент в webapp -> Сохранить с помощью основного сервиса в одну публикацию -> Система событий создает/обновляет копию во второй публикации.

Мы подписаться на событие с помощью:

EventSystem.Subscribe<Component, SaveEventArgs>(Copy, EventPhases.TransactionCommitted); 

У нас есть несколько значений конфигурации, хранящихся в файле Tridion.ContentManager.config и доступ к ним с помощью что-то похожее на:

var configuration = ConfigurationManager.GetSection("custom.events") as NameValueCollection; 
return configuration["Debug"]; 

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

Система событий падает, когда мы пытаемся сохранить компонент извне с помощью основной службы. Ошибки, которые мы видим следующим образом:

Object reference not set to an instance of an object. 

StackTrace Information Details: 
    at Custom.EventsSystem.Configuration.Config.get_Debug() 
    at Custom.EventsSystem.Sync.Copy(Component component, SaveEventArgs args, EventPhases phase) 
    at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Delegate.DynamicInvokeImpl(Object[] args) 
    at Tridion.ContentManager.Extensibility.EventSubscription.DeliverEvent(IEnumerable'1 subjects, TcmEventArgs eventArgs, EventPhases phase) 

Это происходит только тогда, когда экономия запускается с помощью службы ядра, так что я интересно, если есть что-нибудь другое в том, что Tridion читает конфигурационный файл при обращении через ядро оказание услуг?

Будет ли лучший вариант иметь отдельный файл конфигурации, отдельный для Tridion, с которым мы имеем дело вручную?

  0

Если вам удалось сохранить компонент в одной публикации, используя основной сервис, не можете ли вы использовать основную услугу для создания ее копии в другой публикации вместо использования системы событий? 08 май. 132013-05-08 12:18:54

  0

В дополнение к тому, что предложил Ibrar, вы не должны использовать Core Service в Event System, но должен использоваться TOM.NET API. 08 май. 132013-05-08 12:31:17

  0

Мы не можем использовать основную услугу без изменений в кусок важного устаревшего кода. Компоненты необходимы в обоих местах в плане, но проект не может быть изменен, чтобы разделить предметы, которые являются болью! 08 май. 132013-05-08 12:38:10

11

Как вы подключаетесь к основной услуге? Используете ли вы привязку netTCP или привязку wsHttp/basicHttp? В случае первого файла app.config будет TcmServiceHost.exe.config, а для последнего это будет web.config в% TRIDION_HOME% \ webservices ...

+1

Это работало. Мы используем привязку wsHttp, чтобы внести изменения в webservices \ web.config, чтобы включить наш специальный раздел, который исправил нашу проблему. Приветствия Бьорна. 09 май. 132013-05-09 09:01:03


13

Это отличный пример того зла, которое является «Как» слепок

Если вы написали код вроде этого:

var configuration = (NameValueCollection)ConfigurationManager.GetSection("custom.events"); 

Вместо Null Reference исключение, вы получаете Недопустимое исключение Cast, когда GetSection возвращает ConfigurationSection. Разумеется, вы все равно должны выполнить проверку нулевой ссылки в случае, если раздел конфигурации отсутствует, иначе он будет сразу бросаться, когда вы попытаетесь разыменовать индексатор на configuration["Debug"]

+2

+2, только потому, что +1 недостаточно для того, насколько злой может быть «как», а) 08 май. 132013-05-08 15:45:47

  0

@BartKoopman Просто посчитайте, что вам повезло, что вчера я не застал вас за эти «учебные образцы».:-) 08 май. 132013-05-08 18:14:32

  0

Хм-м, вы правы, позвольте мне изменить этот пример завтра; o), как упоминалось здесь, я просто использую этот пример, никогда не выглядел достаточно хорошо на фактическом коде (помимо части об очистке, которая есть). И в то время как As бросает зло, конечно, в этом примере это было бы действительно (в моей защите; o) 09 май. 132013-05-09 22:09:53