SaveBinaryDirect выдает несанкционированные ошибки, когда клиентская объектная модель работает нормально

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

Вопрос

Я решил использовать метод SaveBinaryDirect для загрузки документов на сайт SharePoint из-за отсутствия ограничений на размер запроса/файла, которые есть в клиентской объектной модели.

Приложение выполняет две вещи: добавляет папку (используя объектную модель клиента), а затем загружает выбранный файл в только что созданную папку (используя Save Binary Direct).

Это отлично работает в моей настройке здесь.но на сайте нашего клиента папка создается нормально, но часть загрузки файла возвращает ошибку «Несанкционированное 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);
            }

Это заставляет меня думать об одном из двух

  1. Существует настройка, которую необходимо изменить на точке общего доступа или веб-сервере в отношении авторизации/аутентификации.
  2. Способ применения сетевых учетных данных неверен.поскольку он делает это только для клиентской объектной модели, но не для прямого сохранения двоичного файла.

Я знаю, что мы можем использовать объектную модель клиента, и нам, возможно, придется выпустить еще один выпуск, если это не проблема конфигурации/настройки.

У кого-нибудь, у кого больше опыта в этом, есть идеи, почему он это делает?

Это было полезно?

Решение

Если вы используете SharePoint 2013, вы не можете использовать SaveBinaryDirect, он не работает с аутентификацией претензий.Вызов, сделанный SavebinaryDirect, не включает в себя требуемые файлы файлов авторизации.Подробности обсуждаются в комментариях к этому в блоге: Как сделать активную аутентификацию в Office 365 и SharePoint Online

Обновление (2 июля 2016 г.):

Я взял еще один взгляд на это, увидев комментарий Джеймса Любви.Я не уверен, что изменилось, но мой тест указывает на то, что SavebinaryDirect теперь работает с SharePoint 2013 и SharePoint Online.

Вот код, который я использовал:

// 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");        
.

Другие советы

Попробуйте:

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();
.

Я могу загрузить файл из файловой системы в SharePoint 2010, используя модель объекта клиента.

Если вы получаете несанкционируемые 401, то убедитесь, что вы предоставляете правильные учетные данные и исправьте относительный URL-адрес папки библиотеки документов Target CarePoint.

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();
.

Я думаю, что вы должны добавить это:

ctx.RequestTimeout = 3600000;
.

Я столкнулся с такой же проблемой, и обнаружил обходной путь, хотя я не знаю, является ли это законным.

 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:вам нужно использовать сервер относительный URL-адрес, даже если контекст включает информацию о сайте.

У меня была такая же проблема, и я решил ее с помощью Fiddler.Когда я использовал клиентскую объектную модель, я создавал контекст с путем к сайту, т.е."https://сервер/сайты/имя_сайта", затем

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

Это привело к POST для https://<server>/sites/<siteName>/_vti_bin/client.svc/ProcessQueryпуть и имя файла (и содержимое) были встроены в XML с помощью CSOM.

Сейчас SP.File.SaveBinaryDirect подпись SaveBinaryDirect(ClientContext context, string serverRelativeUrl, Stream stream, bool overwriteIfExists) -- но просьба SaveBinaryDirect(context, "/<library>/<folder>/filename", stream, true) не удалось с ошибкой 401.Посмотрите в Fiddler, и вот сделанный запрос:

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

Несмотря на то, что контекст включает сайт, вы должны дать ему весь путь из корня сервера.Успешный звонок был

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

и это приводит к PUT в правильное место.Параметр является называется serverRelativeUrl после всего.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top