簡體   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