Итак, я пытаюсь получить доступ к файлам из библиотеки документов Sharepoint на C #. Мое приложение размещено на сервере Sharepoint. Кажется, я могу получить доступ к библиотеке, но не к ее элементам.
Вот как я получаю свой контекст в контроллере:
var spContext = SharePointContextProvider.Current.GetSharePointContext(System.Web.HttpContext.Current);
using (var clientContext = spContext?.CreateUserClientContextForSPHost())
{
if (clientContext != null)
{
template.SetMergefields(clientContext);
}
}
И как я пытаюсь получить доступ к файлам:
Web web = clientContext.Web;
List templateList = web.Lists.GetByTitle(libraryName);
clientContext.Load(templateList);
clientContext.ExecuteQuery();
var templateFiles = templateList.RootFolder.Files;
clientContext.Load(templateFiles);
clientContext.ExecuteQuery();
var templateListItems = templateList.GetItems(CamlQuery.CreateAllItemsQuery());
clientContext.Load(templateListItems);
clientContext.ExecuteQuery();
На этом этапе templateList
имеет свойство ItemCount = 8
, которое соответствует количеству файлов в библиотеке. Тем не менее, и templateFiles
, и templateListItems
имеют Count = 0
, поэтому я не могу получить доступ к этим 8 элементам.
Я также попытался получить доступ к одному элементу по его идентификатору, который я искал на Sharepoint:
var itemWithId1 = templateList.GetItemById(1);
clientContext.Load(itemWithId1);
clientContext.ExecuteQuery();
Но это приводит к ошибке:
Microsoft.SharePoint.Client.ServerException: 'Элемент не существует. Возможно, он был удален другим пользователем ».
Другой подход, который я пробовал, заключался в использовании GetFileByServerRelativeUrl
для получения определенного файла:
File file = clientContext.Web.GetFileByServerRelativeUrl(serverRelativeUrl);
clientContext.Load(file);
clientContext.ExecuteQuery();
Это дает мне следующую ошибку:
Microsoft.SharePoint.Client.ServerUnauthorizedAccessException: 'Доступ запрещен. У вас нет разрешения на выполнение этого действия или доступ к этому ресурсу. '
И да, я проверил - у меня есть полные разрешения для этой библиотеки, и она по умолчанию, поэтому разрешения на уровне элементов не отличаются от разрешений библиотеки.
Есть у кого-нибудь идеи, что я делаю не так или как правильно делать? Фактическая цель - получить доступ к определенному файлу из библиотеки по имени файла, список файлов также будет работать.
AppManifest.xml
, в которой показан разделAppPermissionRequests
? Из того, что вы сказали, разрешения приложения неверны, и у него нет доступа к элементам списка, даже если вы это сделаете. - person Equalsk   schedule 30.01.2018AppManifest.xml
не содержитAppPermissionRequests
section. У меня толькоProperties
сTitle
иStartPage
иAppPrincipal
сRemoteWebApplication
. - person themaksmw   schedule 31.01.2018CreateAppOnlyClientContextForSPHost()
и установил<AppPermissionRequests AllowAppOnlyPolicy="true" />
, но код ведет себя точно так же :( - person themaksmw   schedule 31.01.2018<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/list" Right="Write"/>
(ваша может отличаться в зависимости от того, что нужно) - person Equalsk   schedule 31.01.2018<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/list" Right="FullControl" />
- person themaksmw   schedule 31.01.2018http://YourSPSite/_layouts/15/appinv.aspx
и найдете свое приложение по идентификатору, что вы увидите? - person Equalsk   schedule 31.01.2018XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
? Возможно, я должен иметь в виду, что это dev-Sharepoint, и поэтому приложение зарегистрировано как приложение в тестировании. - person themaksmw   schedule 31.01.2018