SaveBinaryDirect lance une opération non autorisée lorsque le modèle d'objet client fonctionne correctement

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/70562

Question

J'ai décidé d'utiliser la méthode SaveBinaryDirect pour télécharger des documents sur le site sharepoint en raison de l'absence des limitations de requête/taille de fichier du modèle objet client.

L'application fait deux choses : ajoute un dossier (à l'aide du modèle objet client), puis télécharge un fichier sélectionné dans le dossier qu'elle vient de créer (à l'aide de Save Binary Direct).

Cela fonctionne bien sur ma configuration ici.mais sur le site de nos clients, le dossier est bien créé mais la partie de téléchargement de fichier renvoie l'erreur « 401 non autorisé ».

            SP.ClientContext ctx = new SP.ClientContext(siteurl);
            SP.Web currentWeb = ctx.Web;
            //Pass user details from config (That has owner permissions)
            ctx.Credentials = new NetworkCredential(username, password, domain);   
            //create folder method (checks if the folder exists and creates using Client Object Model)
            CreateFolder(ctx,libraryUrl,folderName)

            //Save Binary Direct Method
            string fileUrl = "/"+ libraryname + "/" + folderName + "/" + fileName;
            using (data)
            {
                //upload by passing the context, file url, file data stream, 
                //set overwrite to true
                SP.File.SaveBinaryDirect(ctx, fileUrl,data, true);
            }

Cela me fait penser à deux choses

  1. Il existe un paramètre qui doit être modifié sur le point de partage ou le serveur Web en ce qui concerne l'autorisation/l'authentification.
  2. La façon dont j'applique les informations d'identification réseau est incorrecte.car il ne le fait que pour le modèle objet client mais pas pour la sauvegarde directe du binaire.

Je suis conscient que nous sommes en mesure d'utiliser le modèle objet client et que nous devrons peut-être créer une autre version s'il ne s'agit pas d'un problème de configuration/installation.

Quelqu'un avec plus d'expérience dans ce domaine a-t-il une idée sur la raison pour laquelle il fait cela ?

Était-ce utile?

La solution

Si vous utilisez SharePoint 2013, vous ne pouvez pas utiliser SavebinaryDirect, il ne fonctionne pas avec l'authentification des demandes.L'appel effectué par SavotbinaryDirect n'inclut pas les cookies d'autorisation requis.Les détails sont discutés dans les commentaires à ce blog post: Comment faire une authentification active vers Office 365 et SharePoint Online

Mise à jour (2 juillet 2016):

J'ai pris un autre coup d'oeil à cela après avoir vu le commentaire de James Love.Je ne sais pas ce qui a changé mais mon test indique que SavotbinaryDirect travaille maintenant avec SharePoint 2013 et SharePoint Online.

Voici le code que j'ai utilisé:

// var context = new ClientContext("http://intranet.wingtip.com/sites/demo/");
// context.Credentials = System.Net.CredentialCache.DefaultCredentials;

var context = new ClientContext("https://robwindsor2.sharepoint.com/sites/demo/");
context.Credentials = new SharePointOnlineCredentials(loginName, securePassword);

var web = context.Web;
var lib = web.Lists.GetByTitle("Documents");

context.Load(lib);
context.Load(lib.RootFolder);
context.ExecuteQuery();

var fileName = "Test.docx";
var filePath = @"C:\Users\robwindsor\Desktop\" + fileName;
using (var fs = new FileStream(filePath, FileMode.Open))
{
    Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, lib.RootFolder.ServerRelativeUrl + "/" + fileName, fs, true);
}

var query = new CamlQuery();
query.ViewXml = "<View></View>";
var files = lib.GetItems(query);

context.Load(files, c => c.Include(f => f.File));
context.ExecuteQuery();

foreach(ListItem item in files)
{
    Console.WriteLine(item.File.Name);
}

Console.WriteLine("Done");        

Autres conseils

Essayez ceci:

FileCreationInformation fci = new FileCreationInformation();

fci.Content = newFile.Bytes;

fci.Url = sourceFile.Url;

fci.Overwrite = true;

Microsoft.SharePoint.Client.File replacedFile = list.RootFolder.Files.Add(fci);

context.Load(replacedFile);

context.ExecuteQuery();

Je suis capable de télécharger le fichier du système de fichiers vers SharePoint 2010 à l'aide du modèle d'objet client.

Si vous obtenez non autorisé 401, assurez-vous que vous fournissez les bonnes informations d'identification et de corriger l'URL relative du dossier de la bibliothèque de documents SharePoint cible.

ClientContext ctx = new ClientContext(Siteurl);
ctx.Credentials = new System.Net.NetworkCredential("username", "password", "domain");
var sourceFilePath = @"C:\test\test.xlsx";
var targetUrl = "/Shared%20Documents";
var targetFileUrl = String.Format("{0}/{1}", targetUrl, Path.GetFileName(sourceFilePath));
var fs = new FileStream(sourceFilePath, FileMode.Open);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(ctx, targetFileUrl, fs, true);
var uploadedFile = ctx.Web.GetFileByServerRelativeUrl(targetFileUrl);
var listItem = uploadedFile.ListItemAllFields;
listItem.Update();
ctx.ExecuteQuery();

Je pense que vous devez ajouter ceci:

ctx.RequestTimeout = 3600000;

J'ai rencontré le même problème et j'ai trouvé une solution de contournement bien que je ne sache pas si elle est légitime.

 System.Net.WebClient webClient = new System.Net.WebClient();

 System.Uri uri = new Uri(url); //Create a uri object with the file name but without extension

 webClient.Credentials = new NetworkCredential(username,password,domain);        //Network credentials to connect with the sharepoint server

 webClient.UploadFile(uri, "PUT", pFilePath);     //Upload File will push the file to the server

TLDR :vous devez utiliser le serveur URL relative, même si le contexte inclut les informations du site.

J'ai eu ce même problème et je l'ai résolu en utilisant Fiddler.Lorsque j'ai utilisé le modèle objet client, j'ai créé le contexte avec le chemin du site, c'est-à-dire"https://serveur/sites/siteName", alors

var docs = web.Lists.GetByTitle(documentLibraryName);
SP.File uploadFile = docs.RootFolder.Files.Add(newFile);
context.Load(uploadFile);
context.ExecuteQuery();

Cela a abouti à un POST à https://<server>/sites/<siteName>/_vti_bin/client.svc/ProcessQueryle chemin et le nom du fichier (et le contenu) ont été intégrés dans le XML par le CSOM.

Maintenant le SP.File.SaveBinaryDirect la signature est SaveBinaryDirect(ClientContext context, string serverRelativeUrl, Stream stream, bool overwriteIfExists) -- mais la demande SaveBinaryDirect(context, "/<library>/<folder>/filename", stream, true) a échoué avec une erreur 401.Regardez dans Fiddler, et voici la demande faite :

PUT https://<server>/<library>/<filename>

Même si le contexte comprend le site, vous devez lui donner le tout le chemin à partir de la racine du serveur.L'appel réussi a été

SaveBinaryDirect(context, "/sites/<sitename>/<library>/<folder>/filename", stream, true)

et cela se traduit par un PUT au bon emplacement.Le paramètre est appelé serverRelativeUrl après tout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top