You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用.NET从SharePoint下载文件?权限及阈值问题求助

问题解决指南

权限拒绝(Access denied)问题

  • 检查应用权限:ACS应用仅能获取Web Title,说明权限只给到了站点只读级别,需要在SharePoint管理中心给应用授予文档库的读写权限。操作路径:SharePoint管理中心→高级→应用权限→搜索你的Client ID→点击「授予权限」,选择目标站点,授予ReadWrite或FullControl权限(按需最小化授权)。
  • 验证Client Secret:如果Secret过期会导致权限验证失败,重新生成Secret并更新代码中的值。
  • 确认站点URL:确保GetACSAppOnlyContext中的站点URL是完整的站点地址,没有拼写错误。

列表视图阈值超限问题

当文档库/文件夹项目数超过管理员设置的阈值(默认5000条),直接加载全部内容会触发这个错误,优化查询即可解决:

分页获取列表项

var library = context.Web.Lists.GetByTitle("folderName");
CamlQuery query = new CamlQuery();
query.ViewXml = @"<View>
                    <RowLimit>1000</RowLimit>
                  </View>";
ListItemCollection items = library.GetItems(query);
context.Load(items);
context.ExecuteQuery();

// 处理当前页数据,分页加载剩余内容
while (items.ListItemCollectionPosition != null)
{
    query.ListItemCollectionPosition = items.ListItemCollectionPosition;
    items = library.GetItems(query);
    context.Load(items);
    context.ExecuteQuery();
    // 处理分页数据
}

精准获取文件夹下的文件

不要直接加载整个文件夹,通过CamlQuery过滤目标文件夹:

var library = context.Web.Lists.GetByTitle("folderName");
CamlQuery query = new CamlQuery();
query.FolderServerRelativeUrl = "/sites/xxxx/folderName/nestedFolderName";
query.ViewXml = @"<View>
                    <RowLimit>1000</RowLimit>
                  </View>";
ListItemCollection folderItems = library.GetItems(query);
context.Load(folderItems, items => items.Include(item => item.File));
context.ExecuteQuery();

foreach(var item in folderItems)
{
    if(item.File != null)
    {
        Console.WriteLine(item.File.Name);
    }
}

框架替代方案(PnP无效时可选)

改用Microsoft Graph SDK,对现代SharePoint支持更完善:

  1. 在Azure AD注册应用,授予Files.Read.All或Sites.ReadWrite.All应用权限。
  2. 示例代码:
using Microsoft.Graph;
using Azure.Identity;
using System.IO;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "你的租户ID";
var clientId = "你的应用ID";
var clientSecret = "你的应用密钥";

var credential = new ClientSecretCredential(tenantId, clientId, clientSecret, new ClientSecretCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
});

var graphClient = new GraphServiceClient(credential, scopes);

// 获取指定文件夹下的文件
var driveItems = await graphClient.Sites["你的站点ID"].Drives["文档库ID"].Items["文件夹ID"].Children.Request().GetAsync();
foreach(var item in driveItems)
{
    if(item.File != null)
    {
        Console.WriteLine(item.Name);
        // 下载文件到本地
        var stream = await graphClient.Sites["你的站点ID"].Drives["文档库ID"].Items[item.Id].Content.Request().GetAsync();
        using var localStream = new FileStream($"本地路径/{item.Name}", FileMode.Create);
        await stream.CopyToAsync(localStream);
    }
}

内容的提问来源于stack exchange,提问作者tangel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:15:43