Microsoft Graph SDK上传文件时如何设置deferCommit延迟提交参数?
问题根因
deferCommit 是createUploadSession接口请求体的顶级参数,和item参数平级,而你用到的DriveItemUploadableProperties类的所有属性(包括AdditionalData)都会被SDK序列化到请求体的item字段内,所以把deferCommit放到这里不会被接口识别,自然不生效。
正确实现方案
1. 传递deferCommit参数(以Graph SDK v5+版本为例)
你需要构造完整的CreateUploadSessionPostRequestBody对象,将deferCommit放到请求体顶级的AdditionalData中,示例代码如下:
// 构造item节点的属性配置 var driveItemProps = new DriveItemUploadableProperties { ODataType = null, AdditionalData = new Dictionary<string, object> { { "@microsoft.graph.conflictBehavior", "replace" } } }; // 构造完整的创建上传会话请求体 var sessionRequestBody = new CreateUploadSessionPostRequestBody { Item = driveItemProps, // deferCommit放到请求体顶级的附加数据中 AdditionalData = new Dictionary<string, object> { { "deferCommit", true } } }; // 示例:在Drive根目录创建指定文件的上传会话 var uploadSession = await graphClient.Drive.Root .ItemWithPath("your-target-file.ext") .CreateUploadSession .PostAsync(sessionRequestBody);
2. 手动完成提交
所有文件分片上传完成后,你需要向上传会话的UploadUrl发送空POST请求完成提交,示例代码如下:
using var httpClient = new HttpClient(); // 发送空POST请求触发提交 var completeResult = await httpClient.PostAsync(uploadSession.UploadUrl, content: null); if (completeResult.IsSuccessStatusCode) { // 提交成功,可解析返回内容获取最终的DriveItem信息 var resultContent = await completeResult.Content.ReadAsStringAsync(); }
旧版v4 SDK适配
如果你使用的是v4版本的Graph SDK,可以直接构造自定义请求传入deferCommit参数:
var uploadSession = await graphClient.Drive.Root .ItemWithPath("your-target-file.ext") .CreateUploadSession( new DriveItemCreateUploadSessionRequestBody { Item = new DriveItem { AdditionalData = new Dictionary<string, object> { { "@microsoft.graph.conflictBehavior", "replace" } } }, DeferCommit = true }) .Request() .PostAsync();
内容的提问来源于stack exchange,提问作者Dadv
相关产品推荐
相关产品推荐

