使用Microsoft Graph 5.x.x上传SharePoint文件报错:DriveItemRequestBuilder无Root定义
我尝试用以下代码将文件上传到SharePoint站点的共享文件夹:
var uploadSession = await _graphClient.Sites[siteId] .Drives[driveId] .Root .ItemWithPath($"{folderPath}{info.Name}") .CreateUploadSession() .Request() .PostAsync();
出现编译错误:
'DriveItemRequestBuilder' 不包含 'Root' 的定义,也找不到可接受第一个参数为 'DriveItemRequestBuilder' 类型的可访问扩展方法 'Root'(是否缺少 using 指令或程序集引用?)
我试过用.Items["root"]替代.Root,还是报相同错误。
问题分析
- 这是Microsoft.Graph NuGet包的破坏性变更导致的,4.x.x版本能正常编译,但我因为其他代码需求必须使用5.x.x版本。
- 发现存在两个不同的
DriveItemRequestBuilder类:- 位于
Microsoft.Graph.Drives.Item.DriveItemRequestBuilder命名空间,适用于个人文件夹场景(比如var uploadSession = await _graphClient.Drives[myDrive?.Id]); - 位于
Microsoft.Graph.Sites.Item.Drives.Item.DriveItemRequestBuilder命名空间,适用于站点场景(也就是我使用的_graphClient.Sites[siteId].Drive...)。
- 位于
目前找到的示例要么是旧版本的,要么是针对个人文件夹的,求解决办法。
解决方案(Microsoft Graph 5.x适配)
在Graph SDK 5.x版本中,站点关联Drive的API结构做了调整,不再需要通过.Root或.Items["root"]来定位根目录,直接通过.ItemWithPath指定完整路径即可。正确代码如下:
var uploadSession = await _graphClient.Sites[siteId] .Drives[driveId] .ItemWithPath($"{folderPath}{info.Name}") .CreateUploadSession() .PostAsync();
注意事项
- 确保
folderPath格式正确:比如站点共享文件夹的路径应为Shared Documents/目标子文件夹/这类格式,结尾的斜杠可以根据实际情况调整; - 如果需要单独获取根目录的DriveItem,也可以用
ItemWithPath("")或ItemWithPath("/")来定位,不过直接指定完整文件路径更高效; - 5.x版本中移除了
.Request()方法,直接调用.PostAsync()即可发起请求,这也是和旧版本的一个重要区别。
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

