(401) 从 SharePoint 下载文件时出现未经授权的异常

2024-01-06

我已使用 SharePoint Online 服务器的 OAuth 机制生成了访问令牌。我正在使用此令牌通过 CSOM 创建 ClientContext。虽然我能够无缝访问所有网站、库和文件夹,但出现错误

远程服务器返回错误:(401) 未经授权。

从 SharePoint Online 下载文件时。以下是我用于文件下载的代码:

var clientContext = TokenHelper.GetClientContextWithAccessToken("https://adventurer.sharepoint.com/Subsite1", accessToken);
var list = clientContext.Web.Lists.GetByTitle("SubSite 1 Library 1");
string vquery = @"<View Scope='RecursiveAll'><Query><Where><Eq><FieldRef Name='UniqueId' /><Value Type='Lookup'>" + "6718053d-a785-489c-877f-5a4b88dcb2a7" + "</Value></Eq></Where></Query></View>";
CamlQuery query = new CamlQuery();
query.ViewXml = vquery;
var listItems = list.GetItems(query);
clientContext.Load(listItems, items => items.Take(1).Include(item => item.File));
clientContext.ExecuteQuery();

var fileRef = listItems[0].File.ServerRelativeUrl;
var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, fileRef);

我不明白此错误的根本原因,因为我正在使用正确的访问令牌传递客户端上下文。我想知道 OpenBinaryDirect 在使用访问令牌时是否有限制?如果不是,上面的代码有什么问题?是否有其他替代方案可用于使用访问令牌下载?


在尝试了很多替代方案之后,我得出的结论是 OpenBinaryDirect() 不能与 OAuth 令牌一起使用。我可以使用其他两种方法从 SharePoint Online 下载文件。我将答案发布在这里,以便它可以帮助某人:

方法 1(OpenBinaryStream):

var file = clientContext.Web.GetFileByServerRelativeUrl(fileRef);
clientContext.Load(file);
clientContext.ExecuteQuery();                    
ClientResult<Stream> streamResult = file.OpenBinaryStream();
clientContext.ExecuteQuery();

虽然这种方法效果很好,OpenBinaryStream不可用于Microsoft.SharePoint.Client.dll

方法 2(WebClient 或其他 Http 请求):

string downloadUrl = HostURL + "/_api/web/getfilebyserverrelativeurl('" + fileRef + "')/$value";
WebClient client = new WebClient(); 
client.Headers.Add("Authorization", "Bearer " + accessToken);
client.DownloadFile(downloadUrl, filePath);

请注意我用于 WebClient 的下载 URL。普通文件 URL 无法从 SharePoint Online 下载文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(401) 从 SharePoint 下载文件时出现未经授权的异常 的相关文章

随机推荐