问题描述
我试图制作一个简单的控制台应用程序,该应用程序从Share Point Online检索列表项。当我从网站中检索网站列表或列表标题时,它工作正常,但是当我尝试从特定列表中获取列表项目时,我没有收到任何列表项。 我列出了许多类似任务的示例,并且几乎所有示例都是以相同的方式编写的。这就是为什么我不排除我的情况可能是由于权限不足(我附有API权限的屏幕截图)的原因。
请检查我的代码和权限。任何帮助将不胜感激。
应用代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;
namespace SharePointTrigger
{
class Program
{
static async Task Main(string[] args)
{
Uri site = new Uri("https://MyCompany.sharepoint.com/sites/MyProject");
string user = $"ServiceUser@MyCompany.com";
string rawPassword = $"password";
securestring password = new securestring();
foreach (char c in rawPassword) password.AppendChar(c);
using (var authenticationManager = new AuthenticationManager()) //HELPER CLASS TO OBTAIN ACCESS TOKEN
using (var context = authenticationManager.GetContext(site,user,password))
{
//RETRIVING LIST TITLE - WORKS FINE
/*
Web web = context.Web;
context.Load(web.Lists,lists => lists.Include(list => list.Title,list => list.Id));
context.ExecuteQuery();
foreach (SP.List list in web.Lists)
{
Console.WriteLine(list.Title);
}
*/
//RETRIVING LIST ITEM
Web myWeb = context.Web;
SP.List myList = myWeb.Lists.GetByTitle("List_of_Items");
SP.ListItemCollection listItemCollection = myList.GetItems(CamlQuery.CreateallItemsQuery());
context.Load(listItemCollection,eachItem => eachItem.Include(
item => item,item => item["Title"],item => item["ID"]
)
);
context.ExecuteQuery();
foreach (SP.ListItem listItem in listItemCollection)
{
Console.WriteLine("ID: " + listItem["ID"].ToString() + "Title: " + (string)listItem["Title"].ToString());
}
Console.ReadKey();
}
}
}
}
API权限 API permissions
解决方法
在检查您的应用权限或代码问题时,看起来好像没有权限问题。
但是,请看下面的行:
SP.ListItemCollection listItemCollection = myList.GetItems(CamlQuery.CreateAllItemsQuery());
您正试图携带所有物品。
当列表是非常大的列表(> 5000或超过12个查询列)或the list hits a list threshold时,会观察到类似的返回空项目的行为
如果您遇到上述情况-您可以创建索引并过滤项目。
您可以使用CAML查询来过滤项目,而不必一次尝试获取所有项目!
我还要检查这些物品是否具有物品级别权限。
列表设置->高级设置
理想情况下,由于上述原因,您不应遇到此问题,但是此设置会增加作用域的数量,并且可能会导致更快达到阈值。