从提供程序托管的应用程序访问 SharePoint 文档库项目



所以我正在尝试从 C# 中的 SharePoint 文档库中访问文件。我的应用程序是提供程序托管的 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。然而,templateFilestemplateListItemsCount = 0,所以我似乎无法访问这 8 个项目。

我还尝试通过我在Sharepoint上查找的ID访问单个项目:

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: 'Accessdedened.您无权执行此操作或访问此资源。

是的,我已经检查过 - 我确实对此库具有完全权限,并且它是默认设置,因此项目级权限与库的权限没有差异。

有没有人知道我做错了什么或如何正确地做?实际目标是通过文件名访问库中的特定文件,文件列表也可以工作。

您是否尝试以管理员身份启动Visual Studio? 如果这解决了您的问题,您可能需要一个清单文件,并在所需的管理员内部进行更改。 当您尝试访问不属于 Windows 用户的文件(即根文件夹 (C:))时,通常会发生这种情况。

我以前做过这类事情,但我没有使用 C#。如果你想尝试另一种方式,有一个名为PnP PowerShell的PowerShell方法,它可以轻松访问SharePoint应用程序并返回内容(它被Microsoft正式认可)。您可以尝试:

Get-PnPListItem -List <ListPipeBind>
[-Fields <String[]>]
[-PageSize <Int>]
[-ScriptBlock <ScriptBlock>]
[-Web <WebPipeBind>]
[-Connection <SPOnlineConnection>]

它返回列表中的所有项(请记住,文档库只是一个特殊列表,如任务列表或其他列表),有些版本的 cmdlet 仅返回 1 个项。

例如:

PS:> Get-PnPListItem -List Tasks -PageSize 1000

返回"任务"列表的前 1000 个元素。

这是主要的github:https://github.com/SharePoint/PnP-PowerShell/tree/master/Documentation

下面是 cmdlet 文档:https://github.com/SharePoint/PnP-PowerShell/blob/master/Documentation/Get-PnPListItem.md

我可以尝试给出的另一个答案是,您是否直接从服务器位置运行代码?我有时需要这样做才能使我的一些程序正常工作。

若要访问列表项的文件,需要访问列表项本身,并在上下文中加载其File属性:

var docs = clientContext.Web.Lists.GetByTitle(Library);
var listItem = docs.GetItemById(listItemId);
clientContext.Load(docs);
clientContext.Load(listItem, i => i.File);
clientContext.ExecuteQuery();
var fileRef = listItem.File.ServerRelativeUrl;

您绝对确定您有一个包含ID = 1的文件吗?使用您的代码:

var templateListItems = templateList.GetItems(CamlQuery.CreateAllItemsQuery());

clientContext.Load(templateListItems);

clientContext.ExecuteQuery();

获取所有项目,并检查其 ID。

编辑

根据您的评论 - 您是否尝试使用其他查询(编写自己的查询),该查询将根据规则检索某些项目。因为该属性templateList.ItemCount给你一些价值,但仍然不意味着你已经正确加载了项目。这意味着您已加载列表。

查询有一些东西。从我在所有示例中看到的情况来看,他们正在创建这样的查询:

var query = CamlQuery.CreateAllItemsQuery();
var templateListItems = templateList.GetItems(query);

我知道这似乎不是一个交易破坏者,但你知道 - SharePoint...值得一试。

我终于让它工作了!事实证明,SharePoint上的权限是错误的。

在 SharePoint 上的">测试中的应用程序"选项卡中,您可以单击应用程序旁边的">...",转到">管理权限">,您将被转到一个页面,询问您"您是否信任 XXX?"。我非常专注于问题以及">信任它"和">取消">按钮,以至于我没有看到左侧的下拉菜单说">让它完全控制列表:">,并预先选择了"应用程序包"。当我将其更改为我尝试访问的列表时,代码中的一种方法突然起作用了:

List templateList = web.Lists.GetByTitle(libraryName);
clientContext.Load(templateList);
clientContext.ExecuteQuery();
ListItemCollection templateListItems = templateList.GetItems(CamlQuery.CreateAllItemsQuery());
clientContext.Load(templateListItems);
clientContext.ExecuteQuery();

现在templateListItems实际上包含我库中的对象!

当然,可以"优化"代码并删除第一个ExecuteQuery(),或者将CamlQuery.CreateAllItemsQuery()定义为单独的变量并将其传递给GetItems(),或者使用vars而不是显式类型 - 所有这些都有效,这取决于您的喜好。

感谢所有的帮助,我希望我从这里开始得到它:)

相关内容

  • 没有找到相关文章

最新更新