繁体   English   中英

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

[英]access Sharepoint document library items from provider-hosted app

因此,我试图从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 ,该属性与库中的文件数匹配。 但是, templateFilestemplateListItems都具有Count = 0因此我似乎无法访问这8个项目。

我还尝试通过其在ID上查找的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: '访问被拒绝。 您没有执行此操作或访问此资源的权限。”

是的,我已经检查过-我确实拥有此库的全部权限,并且它是默认设置,因此项目级权限与库的权限没有不同。

有人知道我在做什么错或如何正确做吗? 实际目标是通过文件名从库中访问特定文件,文件列表也将起作用。

您是否尝试以管理员身份启动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() ,或者使用var而不是显式类型-所有这些工作,这取决于您的偏好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM