Accéder à la configuration à partir du système d'événements lorsqu'il est déclenché via le service principal


19

Avoir un peu de problème avec le système d'événements lors du déclenchement d'un événement via le service principal.

Nous avons enregistré des composants dans une publication que nous devons copier dans une autre publication dans la même instance de Tridion. Ces composants sont enregistrés à partir d'une application distincte qui utilise le service principal.

Donc en résumé: Créer/mettre à jour un composant dans webapp -> Sauvegarder via le service principal dans une publication -> Le système d'événements crée/met à jour la copie dans la deuxième publication.

Nous souscrivons à l'événement en utilisant:

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

Nous avons quelques valeurs de configuration stockées dans le fichier Tridion.ContentManager.config et accéder à ces utilisant quelque chose de similaire à:

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

La copie La méthode fonctionne bien car elle ouvre manuellement le composant dans l'interface et la sauvegarde s'effectue exactement comme prévu. Les valeurs de configuration sont lues in fine et le composant est copié avec tout le contenu et les métadonnées corrects.

Le système d'événements tombe en panne lorsque nous essayons d'enregistrer un composant en externe à l'aide du service principal. Les erreurs que nous voyons est la suivante:

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) 

Cela se produit uniquement lorsque la sauvegarde est déclenchée par le service de base, donc je me demande s'il y a quelque chose de différent de la façon dont Tridion lit le fichier de configuration quand on y accède via le noyau un service?

La meilleure solution serait-elle d'avoir un fichier de configuration distinct de Tridion avec lequel nous traitons manuellement?

  0

Si vous parvenez à enregistrer le composant dans une publication en utilisant le service de base, ne pouvez-vous pas utiliser le service de base pour en créer une copie dans une autre publication au lieu d'utiliser le système d'événements? 08 mai. 132013-05-08 12:18:54

  0

En plus de ce que Ibrar a suggéré, vous ne devriez pas utiliser Core Service dans Event System mais l'API TOM.NET devrait être utilisée. 08 mai. 132013-05-08 12:31:17

  0

Nous ne pouvons plus utiliser le service principal sans modifier un élément important du code existant. Les composants sont nécessaires dans les deux endroits dans le plan, mais le plan ne peut pas être modifié pour partager les éléments, ce qui est une douleur! 08 mai. 132013-05-08 12:38:10

11

Comment vous connectez-vous au service principal? Utilisez-vous une liaison netTCP ou une liaison wsHttp/basicHttp? Dans le cas de l'ancien, le fichier app.config serait TcmServiceHost.exe.config et pour ce dernier, il serait web.config dans% TRIDION_HOME% \ webservices ...

+1

Cela a fonctionné un régal. Nous utilisons la liaison wsHttp afin de modifier le webservices \ web.config pour inclure notre section personnalisée pour résoudre notre problème. À la vôtre Bjorn. 09 mai. 132013-05-09 09:01:03


13

Ceci est un excellent exemple du mal qui est le « As » jeté

Si vous avez écrit votre code comme ceci:

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

Au lieu d'une exception référence nulle, vous obtiendrez un Exception Cast non valide lorsque GetSection renvoie une ConfigurationSection. Bien sûr, vous devez quand même implémenter une vérification de référence nulle, au cas où la section de configuration n'est pas présente, sinon elle sera lancée immédiatement lorsque vous essaierez de déréférencer l'indexeur à configuration["Debug"]

+2

+2, juste parce que +1 ne suffit pas pour que le casting "As" puisse être mauvais, o) 08 mai. 132013-05-08 15:45:47

  0

@BartKoopman Ne comptez vous que chanceux que je ne vous l'ai pas récupéré hier avec ces "échantillons de formation".:-) 08 mai. 132013-05-08 18:14:32

  0

Hmmm vous avez raison, permettez-moi de changer cet exemple demain; o), comme mentionné ici, j'utilise simplement l'exemple, jamais vraiment regardé assez bien le code réel (en dehors de la partie sur le nettoyage qui est). Et tandis que les lancers sont mauvais bien sûr, dans cet exemple ce serait un valide (dans ma défense; o) 09 mai. 132013-05-09 22:09:53