.NET应用(VS2019)访问SharePoint链接及列出文档问题求助
原代码存在的问题
- 基础语法错误:
username变量未加字符串引号,password的引号未闭合,部分语句缺少分号,编译无法通过 - 异步方法误用:
ExecuteQueryAsync是异步方法,未使用await会导致逻辑执行顺序混乱,无法正确获取数据 - 未实现核心需求:仅加载了Site对象,没有遍历文档库及文档的逻辑
正确实现代码
首先在VS2019中安装NuGet包:Microsoft.SharePointOnline.CSOM,然后使用以下完整代码:
using System; using System.Security; using Microsoft.SharePoint.Client; using System.Linq; class SharePointDocumentLister { static async System.Threading.Tasks.Task Main(string[] args) { // 替换为你的SharePoint站点URL string siteCollectionUrl = "https://reedelsevier.sharepoint.com/"; // 注意:必须使用该SharePoint绑定的企业账号,不能用普通gmail string username = "your-account@reedelsevier.onmicrosoft.com"; string password = "your-password"; // 构建安全密码对象 SecureString securePassword = new SecureString(); foreach (char c in password) { securePassword.AppendChar(c); } // 使用using确保ClientContext正确释放 using (ClientContext ctx = new ClientContext(siteCollectionUrl)) { ctx.Credentials = new SharePointOnlineCredentials(username, securePassword); try { // 加载当前站点的根Web对象 Web web = ctx.Web; ctx.Load(web, w => w.Title, w => w.ServerRelativeUrl); await ctx.ExecuteQueryAsync(); Console.WriteLine($"当前站点:{web.Title}"); // 获取目标文档库,替换为你实际要访问的库名称 List docLibrary = web.Lists.GetByTitle("文档"); ctx.Load(docLibrary); await ctx.ExecuteQueryAsync(); // 查询库中所有项目,过滤出文档(排除文件夹) CamlQuery query = CamlQuery.CreateAllItemsQuery(); ListItemCollection items = docLibrary.GetItems(query); // 指定要加载的文档属性,减少数据传输 ctx.Load(items, items => items.Include( item => item.File.Name, item => item.File.ServerRelativeUrl, item => item.File.TimeCreated)); await ctx.ExecuteQueryAsync(); // 输出文档信息 Console.WriteLine("\n文档列表:"); foreach (ListItem item in items.Where(i => i.File != null)) { Console.WriteLine($"名称:{item.File.Name}"); Console.WriteLine($"访问路径:{siteCollectionUrl.TrimEnd('/')}{item.File.ServerRelativeUrl}"); Console.WriteLine($"创建时间:{item.File.TimeCreated}\n"); } } catch (Exception ex) { Console.WriteLine($"访问失败:{ex.Message}"); // 如需排查详细错误,可输出ex.StackTrace } } } }
重要注意事项
- 账号权限:必须使用与该SharePoint站点绑定的企业账号(格式通常为xxx@企业域名.onmicrosoft.com),普通个人邮箱无访问权限
- 文档库名称:代码中的"文档"是SharePoint默认文档库的中文名称,若你的库是英文名称则替换为"Documents",或对应自定义名称
- 异步处理:所有CSOM异步操作必须搭配
await使用,否则会出现未预期的空引用或数据未加载问题 - 权限验证:确保账号拥有目标文档库的读取权限,否则会抛出权限不足的异常
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

