![](/img/trans.png)
[英]Retrieving SharePoint 2013 List Data from Sharepoint provider hosted app
[英]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個項目。
我還嘗試通過其在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.