从提供商托管的应用程序访问 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
确实与库中的文件数相匹配。然而,templateFiles
和 templateListItems
都有 Count = 0
,所以我似乎无法访问这 8 个项目。
我还尝试通过在 Sharepoint 上查找的 ID 访问单个项目:
var itemWithId1 = templateList.GetItemById(1);
clientContext.Load(itemWithId1);
clientContext.ExecuteQuery();
然而这会导致错误:
Microsoft.SharePoint.Client.ServerException: 'Item does not exist. It may have been deleted by another user.'
我尝试的另一种方法是使用 GetFileByServerRelativeUrl
获取特定文件:
File file = clientContext.Web.GetFileByServerRelativeUrl(serverRelativeUrl);
clientContext.Load(file);
clientContext.ExecuteQuery();
这给了我以下错误:
Microsoft.SharePoint.Client.ServerUnauthorizedAccessException: 'Access denied. You do not have permission to perform this action or access this resource.'
是的,我已经检查过 - 我确实拥有此库的完全权限,并且它处于默认设置,因此项目级权限与库的权限没有区别。
有没有人知道我做错了什么或如何正确地做?实际目标是通过文件名从库中访问特定文件,文件列表也可以。
您是否尝试 Visual Studio 以管理员身份启动?
如果这解决了您的问题,您可能需要一个清单文件并在需要的管理员内部进行更改。
当您尝试访问不属于 Windows 用户的文件时,通常会发生这种情况,这意味着根文件夹 (C:)。
我以前做过这类事情,但我没有用过C#。如果您想尝试另一种方式,有一种名为 PnP PowerShell 的 PowerShell 方法可以轻松访问 SharePoint 应用程序和 return 东西(它已被 Microsoft 正式认可)。你可以试试 :
Get-PnPListItem -List <ListPipeBind>
[-Fields <String[]>]
[-PageSize <Int>]
[-ScriptBlock <ScriptBlock>]
[-Web <WebPipeBind>]
[-Connection <SPOnlineConnection>]
其中 return 列表中的所有项目(请记住,文档库只是一个特殊列表,如任务列表或其他列表),有些版本的 cmdlet 仅 return 1 项。
例如:
PS:> Get-PnPListItem -List Tasks -PageSize 1000
return是任务列表的前 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 上,在 "Apps in Testing" 选项卡中,您可以单击应用旁边的 "..." ,转到 "MANAGE PERMISSIONS",您将被转到一个询问您 "Do you trust XXX?" 的页面。我太专注于问题和 "Trust It" 和 "Cancel" 按钮,以至于我没有看到下拉菜单左边说 "Let it have full control of the list:" 预选了 "App Packages"。当我将其更改为我试图访问的列表时,我的代码中的一种方法突然起作用了:
List templateList = web.Lists.GetByTitle(libraryName);
clientContext.Load(templateList);
clientContext.ExecuteQuery();
ListItemCollection templateListItems = templateList.GetItems(CamlQuery.CreateAllItemsQuery());
clientContext.Load(templateListItems);
clientContext.ExecuteQuery();
现在 templateListItems
实际上包含我图书馆中的对象!
当然可以 "optimize" 代码并删除第一个 ExecuteQuery()
,或者将 CamlQuery.CreateAllItemsQuery()
定义为单独的变量并将其传递给 GetItems()
,或者使用var
s 而不是显式类型 - 所有这些都有效,这取决于您的喜好。
感谢所有帮助,我希望我能从这里得到它:)
所以我正在尝试从 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
确实与库中的文件数相匹配。然而,templateFiles
和 templateListItems
都有 Count = 0
,所以我似乎无法访问这 8 个项目。
我还尝试通过在 Sharepoint 上查找的 ID 访问单个项目:
var itemWithId1 = templateList.GetItemById(1);
clientContext.Load(itemWithId1);
clientContext.ExecuteQuery();
然而这会导致错误:
Microsoft.SharePoint.Client.ServerException: 'Item does not exist. It may have been deleted by another user.'
我尝试的另一种方法是使用 GetFileByServerRelativeUrl
获取特定文件:
File file = clientContext.Web.GetFileByServerRelativeUrl(serverRelativeUrl);
clientContext.Load(file);
clientContext.ExecuteQuery();
这给了我以下错误:
Microsoft.SharePoint.Client.ServerUnauthorizedAccessException: 'Access denied. You do not have permission to perform this action or access this resource.'
是的,我已经检查过 - 我确实拥有此库的完全权限,并且它处于默认设置,因此项目级权限与库的权限没有区别。
有没有人知道我做错了什么或如何正确地做?实际目标是通过文件名从库中访问特定文件,文件列表也可以。
您是否尝试 Visual Studio 以管理员身份启动? 如果这解决了您的问题,您可能需要一个清单文件并在需要的管理员内部进行更改。 当您尝试访问不属于 Windows 用户的文件时,通常会发生这种情况,这意味着根文件夹 (C:)。
我以前做过这类事情,但我没有用过C#。如果您想尝试另一种方式,有一种名为 PnP PowerShell 的 PowerShell 方法可以轻松访问 SharePoint 应用程序和 return 东西(它已被 Microsoft 正式认可)。你可以试试 :
Get-PnPListItem -List <ListPipeBind>
[-Fields <String[]>]
[-PageSize <Int>]
[-ScriptBlock <ScriptBlock>]
[-Web <WebPipeBind>]
[-Connection <SPOnlineConnection>]
其中 return 列表中的所有项目(请记住,文档库只是一个特殊列表,如任务列表或其他列表),有些版本的 cmdlet 仅 return 1 项。
例如:
PS:> Get-PnPListItem -List Tasks -PageSize 1000
return是任务列表的前 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 上,在 "Apps in Testing" 选项卡中,您可以单击应用旁边的 "..." ,转到 "MANAGE PERMISSIONS",您将被转到一个询问您 "Do you trust XXX?" 的页面。我太专注于问题和 "Trust It" 和 "Cancel" 按钮,以至于我没有看到下拉菜单左边说 "Let it have full control of the list:" 预选了 "App Packages"。当我将其更改为我试图访问的列表时,我的代码中的一种方法突然起作用了:
List templateList = web.Lists.GetByTitle(libraryName);
clientContext.Load(templateList);
clientContext.ExecuteQuery();
ListItemCollection templateListItems = templateList.GetItems(CamlQuery.CreateAllItemsQuery());
clientContext.Load(templateListItems);
clientContext.ExecuteQuery();
现在 templateListItems
实际上包含我图书馆中的对象!
当然可以 "optimize" 代码并删除第一个 ExecuteQuery()
,或者将 CamlQuery.CreateAllItemsQuery()
定义为单独的变量并将其传递给 GetItems()
,或者使用var
s 而不是显式类型 - 所有这些都有效,这取决于您的喜好。
感谢所有帮助,我希望我能从这里得到它:)