SalvaBinaryDirect Getti non autorizzati quando il modello dell'oggetto client funziona bene
-
10-12-2019 - |
Domanda
Ho deciso di utilizzare il metodo salvabinarydirect per caricare documenti sul sito di SharePoint a causa di non avere le limitazioni della dimensione / dimensione del file che il modello del oggetto client ha.
L'applicazione fa due cose, aggiunge una cartella (utilizzando il modello oggetto client) e quindi carichi un file selezionato nella cartella che ha appena creato (utilizzando SAVE BINY Direct).
funziona bene sulla mia configurazione qui. Ma nel nostro sito dei nostri clienti la cartella viene creata, ma la parte di caricamento del file restituisce l'errore "non autorizzato 401".
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);
}
.
Questo mi fa pensare a una delle due cose
- .
- Esiste un'impostazione che deve essere modificata nel punto di condivisione o del server Web per quanto riguarda l'autorizzazione / autenticazione.
- Il modo in cui sto applicando le credenziali di rete non è corretta. Poiché lo fa solo per il modello dell'oggetto client ma non il salvataggio binario diretto.
Sono consapevole del fatto che siamo in grado di utilizzare il modello dell'oggetto client e potremmo dover fare un'altra versione se non è un problema di configurazione / configurazione.
Chiunque abbia più esperienza con questo avere alcune idee sul perché è farlo?
Soluzione
Se si utilizza SharePoint 2013 non è possibile utilizzare SaveBinaryDirect, non funziona con l'autenticazione delle rivendicazioni.La chiamata effettuata da SaveBinaryDirect non include i cookie di autorizzazione necessari.I dettagli sono discussi nei commenti a questo post del blog: Come eseguire l'autenticazione attiva su Office 365 e SharePoint online
Aggiornamento (2 luglio 2016):
Ho preso un'altra occhiata a questo dopo aver visto il commento di James Love.Non sono sicuro di cosa sia cambiato, ma il mio test indica che SaveBinaryDirect ora lavora con SharePoint 2013 e SharePoint online.
Ecco il codice che ho usato:
.// 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");
Altri suggerimenti
Prova questo:
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();
. Sono in grado di caricare il file dal file system a SharePoint 2010 utilizzando il modello dell'oggetto client.
Se si sta ricevendo non autorizzati 401, assicurati di fornire le credenziali giuste e il corretto URL relativo della cartella Biblioteca Documenti di SharePoint di destinazione.
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();
. Penso che devi aggiungere questo:
ctx.RequestTimeout = 3600000;
. Ho incontrato lo stesso problema e ho trovato una soluzione alternativa anche se non so se è legittimo.
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: è necessario utilizzare server relativo URL, anche se il contesto include le informazioni del sito.
Ho avuto lo stesso problema e lo ha risolto usando Fiddler. Quando ho usato il modello oggetto client, ho creato il contesto con il percorso del sito, ovvero " https:// server / siti / setename < / a> ", quindi
.
var docs = web.Lists.GetByTitle(documentLibraryName);
SP.File uploadFile = docs.RootFolder.Files.Add(newFile);
context.Load(uploadFile);
context.ExecuteQuery();
PUT https://<server>/<library>/<filename>
SaveBinaryDirect(context, "/sites/<sitename>/<library>/<folder>/filename", stream, true)