Доступ запрещен при загрузке файла из Sharepoint CSOM - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь загрузить файл с клиентского сайта Sharepoint.Я использую sharepoint CSOM.

Мой код выглядит следующим образом:

using Microsoft.SharePoint.Client;

var username = "username";
var password = "pass";

var url = "https://myclient.sharepoint.com/";
var fileurl = "https://myclient.sharepoint.com/teams/folder1/folder%20x/somefile.docx";
using (ClientContext context = new ClientContext(url))
{    
    SecureString passWord = new SecureString();
    foreach (char c in password.ToCharArray()) passWord.AppendChar(c);
    context.Credentials = new SharePointOnlineCredentials(username, passWord);

    Uri filename = new Uri(fileurl);
    string server = filename.AbsoluteUri.Replace(filename.AbsolutePath, "");
    string serverrelative = filename.AbsolutePath;

    Microsoft.SharePoint.Client.File file = context.Web.GetFileByServerRelativeUrl(serverrelative);
    context.Load(file);
    ClientResult<Stream> streamResult = file.OpenBinaryStream();
    context.ExecuteQuery();
    var file2 = streamResult.Value;
}

Проблема в том, что мне отказано в доступе, но когда я вхожу с теми же учетными данными, я могу успешно загрузить файл.

  • Есть ли в Sharepoint отдельное разрешение для загрузки файла из API вместо пользовательского интерфейса?
  • Может ли быть проблема в имени папки?

ОБНОВЛЕНИЕ

Проверено, это не имеет никакого отношения к пробелам в папке или имени файла.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Проблема была в том, что я не подключался к нужному URL ( новый ClientContext (url) )

Я подключался к: https://myclient.sharepoint.com/

Я должен былподключался к: https://myclient.sharepoint.com/teams/folder1/

0 голосов
/ 10 октября 2018

Если сайт SharePoint использует нескольких поставщиков аутентификации, использующих набор учетных данных Windows (также актуально для SharePoint Online), дополнительный заголовок должен быть включен в запрос: X-FORMS_BASED_AUTH_ACCEPTED со значением f

Для ClientContext класса заголовок может быть включен следующим образом:

ctx.ExecutingWebRequest += (sender, e) =>
{
    e.WebRequestExecutor.WebRequest.Headers["X-FORMS_BASED_AUTH_ACCEPTED"] = "f";
};

Пример

var file = ctx.Web.GetFileByUrl(fileAbsUrl);
ctx.Load(file);
var streamResult = file.OpenBinaryStream();
ctx.ExecuteQuery();


//save into file
using (var fileStream = System.IO.File.Create(@"C:\path\filename.docx"))
{
   streamResult.Value.Seek(0, SeekOrigin.Begin);
   streamResult.Value.CopyTo(fileStream);
}

Примечание: вместо преобразования в относительный URL используется GetFileByUrl метод , который принимает absolute url

...