2 votes

Impossible de supprimer un composant via TridionCoreService

Je ne parviens pas à supprimer un élément en utilisant le CoreService SessionAwareCoreServiceClient. Je suis capable de créer/lire des composants, de créer des dossiers... . Comme erreur, j'ai obtenu "Object reference not set to an instance of an object". Je tiens à préciser que j'utilise le core service dans mon application en dehors de la machine Tridion Content Manager. Voici les journaux du serveur CM :

Utilisateur : NT AUTHORITY \NETWORK SERVICE

Détails des informations du StackTrace : à Tridion.UGC.EventHandler.UGCEventHandler.GetDataSourcesForTCM(String[] tcm) at Tridion.UGC.EventHandler.UGCEventHandler.DeleteItemStats(TcmUri tcm)
sur Tridion.UGC.EventHandler.UGCEventHandler.HandlerForComitted(IdentifiableObject subject, DeleteEventArgs args, EventPhases phase) at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature 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) at Tridion.ContentManager.Extensibility.EventSystem.DeliverEvent(IEnumerable 1 sujets, TcmEventArgs eventArgs, EventDeliveryPhase deliveryPhase)
sur Tridion.ContentManager.Extensibility.EventSystem.DeliverEvent(IdentifiableObject subject, TcmEventArgs eventArgs, EventDeliveryPhase deliveryPhase)
at Tridion.ContentManager.IdentifiableObject.Delete(DeleteEventArgs deleteEventArgs) at Tridion.ContentManager.IdentifiableObject.Delete() at Tridion.ContentManager.CoreService.CoreServiceBase.Delete(String id)
at SyncInvokeDelete(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at Tridion.ContentManager.CoreService.TransactionSupportInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) at rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) at rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) at rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Avec le compte utilisé, je suis en mesure de supprimer manuellement un élément, ce qui signifie que j'ai les bonnes permissions. Toute aide/suggestion à ce sujet serait plus que bienvenue...


 _client = new SessionAwareCoreServiceClient("wsHttp_2011");
            bool useWindowsCredentials = bool.Parse(Environment.EnvironmentUserSettings.UseWindowsCredentials);
            var credentials = CredentialCache.DefaultNetworkCredentials;
            if (!useWindowsCredentials)
            {
                string password=Environment.EnvironmentUserSettings.Password;
                credentials = new NetworkCredential(Environment.EnvironmentUserSettings.UserName, password);
            }

            _client.ChannelFactory.Credentials.Windows.ClientCredential = credentials;

Ce code est utilisé pour l'usurpation d'identité. Dans le fichier de configuration, j'ai la possibilité de décider si les informations d'identification de Windows seront utilisées ou celles du fichier de configuration. J'ai obtenu l'erreur soit en utilisant le compte LDAP de Windows, soit en entrant les informations d'identification manuellement. Je n'ai pas encore essayé d'utiliser SDL Administrator pour cela. Je vais l'essayer et vous en informer. Quoi qu'il en soit, je vous remercie pour vos efforts.

@UPDATE : J'ai essayé d'utiliser le CoreService ordinaire avec le point de terminaison http de base et j'obtiens toujours la même erreur. Donc l'authentification ne cause pas de problèmes ici. Il semble que quelque chose ne va pas avec les événements UGC. Malheureusement, je n'ai pas de source de code ni d'informations supplémentaires sur la dll activée par UGC.

5voto

Bart Koopman Points 4775

Le stacktrace mentionne le UGCEventHandler, donc je suppose que UGC est installé, vous pourriez essayer de désactiver temporairement ce système d'événement et voir si cela aide, mais je pense que ce n'est pas la racine de votre problème puisque vous mentionnez que vous êtes capable de supprimer manuellement avec cet utilisateur.

Cependant, vous mentionnez "...utiliser le service central dans mon application en dehors de la machine Tridion Content Manager", et vous indiquez également que vous utilisez le service central Session Aware.

EDIT : Vous utilisez donc le client Session Aware Core Service et vous fournissez également un mot de passe. Le client de service de base conscient de la session est censé être utilisé dans une situation où votre compte utilisateur est déjà authentifié, ou lorsque vous appelez le service de base par le biais d'un utilisateur d'impersonnalisation SDL Tridion valide, sur lequel vous impersonnalisez l'appel du service de base à un nom d'utilisateur SDL Tridion valide par le simple nom d'utilisateur (pas de mot de passe requis).

Essayez d'utiliser le Core Service Client normal comme expliqué ici : Obtenir le client Core Service sans fichier de configuration .

Ou, si vous insistez pour utiliser le client de service central conscient de la session (ce qui, à mon avis, n'est pas approprié dans votre cas), assurez-vous que votre application est exécutée sous un utilisateur d'authentification SDL Tridion valide (puisque vous êtes exécuté sur un serveur externe, vous devez ajouter un compte de domaine dans le snap-in MMC SDL Tridion), puis authentifiez le client de service central comme suit :

using (SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient())
{
    // impersonate with valid user
    client.Impersonate("SDL Tridion Username here");
    // use client
    client.Delete(...);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X