none
Problème de récupération d'un document dans Sharepoint 2013 via CMIS RRS feed

  • Question

  • Bonjour à tous,

    Je développe une classe à l'aide de DotCMIS, fournit par Apache pour permettre la connexion à une GED (Alfresco / Sharepoint 2013) pour envoyer ou récupérer des documents.

    Pour le moment, j'arrive à créer des répertoires, envoyer des documents et mettre à jour les documents.

    Mon problème, c'est que je n'arrive pas à récupérer mes documents.

    D’après les tutos que j'ai pu trouver sur le NET, la méthode pour récupérer un document dans un répertoire serait la suivante :

    string repertoireCmis = "/Dossier de test";
    // Récupération de l'identifiant du répertoire
    string idFolder = session.GetObjectByPath(repertoireCmis).Id;
    
    ICmisObject cmisobj = session.GetObject((session.CreateObjectId(idFolder)));
    IFolder rep = (IFolder)cmisobj;
    
    IEnumerable<ICmisObject> liste = rep.GetChildren();
    
    // Puis on parcourt la liste
    
    foreach (var fichier in liste)
    {
    	try
    	{
    		IDocument iDocument = (IDocument)fichier;
    		IContentStream iContentStream = iDocument.GetContentStream();
    		IProperty description = iDocument["cmis:description"];
    
    		if (iContentStream.Stream != null)
    		{
    			if (description.Value == null || !description.Value.ToString().Contains("--t"))
    			{
    				FileStream fileStream = File.OpenWrite(Path.Combine(DossierDestination, fichier.Name));
    				System.IO.Stream stream = iContentStream.Stream;
    				int position;
    				byte[] Buffer = new byte[4096];
    
    				do
    				{
    					position = stream.Read(Buffer, 0, 4096);
    					fileStream.Write(Buffer, 0, position);
    				} while (position != 0);
    
    				stream.Close();
    				fileStream.Close();
    
    				Dictionary<string, object> proprietes = new Dictionary<string, object>();
    				if (description.Value == null)
    					proprietes["cmis:description"] = "--t";
    				else
    				{
    					proprietes["cmis:description"] = description.Value.ToString() + " --t";
    				}
    
    				var objectCMISSource = fichier.UpdateProperties(proprietes);
    
    				if (fichier.Id == objectCMISSource.Id)
    				{
    					objectCMISSource.Refresh();
    				}
    
    				resultat = true;
    			}
    		}
    		else
    		{
    
    		}
    	}
    	catch (Exception ex)
    	{
    	}
    }


    Sauf qu'au moment de remplir ma liste avec rep.GetChildren(), j'ai une erreur : 401 UNAUTHORIZED.

    À savoir que ce problème se produit uniquement lorsque je veux récupérer un document sur Sharepoint 2013. Le code ci-dessus fonctionne correctement sur Alfresco

    En espérant que quelqu'un pourra me venir en aide

    Cordialement

    Frank

    • Modifié Frank569 vendredi 29 mai 2015 08:11
    • Déplacé Teodora Sharkova vendredi 5 juin 2015 09:42 deplacé de Visual C#
    vendredi 29 mai 2015 08:10

Toutes les réponses

  • Bonjour à vous,

    Unauthorized, hum.

    Dans votre code je ne vois pas d'authentification ?!

    Peut être que le probléme vient de la.

    Je suis pas expert sur CMIS mais en cherchant un peu j'ai trouver ceci:

    Dictionary<string, string> parameters = new Dictionary<string, string>();
    parameters[SessionParameter.BindingType] = BindingType.AtomPub;
    parameters[SessionParameter.AtomPubUrl] = "http://mysharepoint";
    parameters[SessionParameter.User] = "SPAdmin";
    parameters[SessionParameter.Password] = "1234sharepoint";
    
    SessionFactory factory = SessionFactory.NewInstance();
    ISession session = factory.GetRepositories(parameters)[0].CreateSession();

    Par contre j'ai aussi vu sur le web que le NTLM est supporté que à partir de DotCMIS 0.5, juste au cas ou vous n'utiliseriez pas la toute derniere version...

    Bien à vous,

    Valentin


    SharePoint Administrator & Developer Expert My blog: http://vlecerf.be Twitter: @IoX_ Microsoft Partner | MCP

    mercredi 10 juin 2015 13:15
  • Bonjour Valentin

    Les paramètres d'identification sont bien présents dans mon cas :)

    Ils sont juste déclarés dans une autre classe que celle postée plus haut.

    En ce qui concerne la version, j'utilise la version 0.7 de DotCMIS.

    Après avoir passé beaucoup de temps sur le Net pour glaner des informations afin de résoudre mon problème, il est possible que ce soit une mauvaise configuration du serveur SharePoint.

    N'étant pas un expert Sharepoint, je ne sais par où commencer afin de vérifier si les droits de lister les documents d'un répertoire sont bien actifs.

    Si un expert passe par là, je suis preneur pour un coup de pouce

    Cordialement

    Frank

    jeudi 11 juin 2015 06:48
  • Bonjour Frank,

    Je suis expert SharePoint mais ne connaissant pas assez le fonctionnement de DotCMIS, je ne sais pas trop ou le probléme pourrais provenir.

    Niveau autorisation clairement si l'utilisateur à le droit de READ sur la DocLib c'est ok.

    Par contre il faut s'assurer que le web service est actif (de sharepoint)

    Vous pouvez toujours essayer de faire un test avec votre user de lister la doclib en question, ce topic vous aidera:

    https://msdn.microsoft.com/en-us/library/office/fp142380.aspx

    Bon courage,

    Valentin


    SharePoint Administrator & Developer Expert My blog: http://vlecerf.be Twitter: @IoX_ Microsoft Partner | MCP

    mercredi 17 juin 2015 09:58
  • Bonsoir Valentin,

    Merci pour votre retour.

    Je vais faire des tests à l'aide du topic.

    Je vous tiens au courant si ça résout mon problème.

    Pour information, je ne passe pas par les web service dans mon code.

    Je passe par une connexion en Atom

    Ci-dessous, les paramètres passés pour se connecter au serveur SharePoint

    cmis.Url = "http://site-sharepoint/_vti_bin/cmis/rest?getRepositories"; cmis.Type = "atompub"; cmis.NomUtilisateur = "monuser"; cmis.Motdepasse = "monmotdepase";

    CreerSessionCmis(cmis);


    La classe pour effectuer la connexion.

    private static void CreerSessionCmis(iXBxxPlugin.Protocoles.CMIS.ConfigurationServeur Configuration)
            {
    
                Dictionary<string, string> parameters = new Dictionary<string, string>();
                parameters[DotCMIS.SessionParameter.AtomPubUrl] = Configuration.Url;
                parameters[DotCMIS.SessionParameter.BindingType] = Configuration.Type;
                parameters[DotCMIS.SessionParameter.User] = Configuration.NomUtilisateur;
                parameters[DotCMIS.SessionParameter.Password] = Configuration.Motdepasse;
                parameters[DotCMIS.SessionParameter.AuthenticationProviderClass] = "DotCMIS.Binding.NtlmAuthenticationProvider";
          
                SessionFactory factory = SessionFactory.NewInstance();
                session = factory.GetRepositories(parameters)[0].CreateSession();
            }


    • Modifié Frank569 mercredi 17 juin 2015 16:27
    mercredi 17 juin 2015 16:26