.NET API上传OneDrive报错:仅允许JSON Content-Type头写入
问题排查与解决
核心问题:错误的文件夹路径格式
你遇到的报错本质是因为传入的文件夹路径是完整的SharePoint URL,而Microsoft Graph API的ItemWithPath方法需要的是OneDrive/SharePoint Drive内的相对路径,不是完整的Web URL。这种错误路径会导致API误将你的请求解析为对元数据的修改(需要JSON Content-Type),而非文件内容上传。
具体修正步骤
1. 替换文件夹路径为相对路径
将控制器中的folderName从完整URL改为Drive内的相对路径:
原代码:
var folderName = "https://springernature-my.sharepoint.com/:f:/r/personal/mbu4174_springernature_com/Documents/PicScout";
修改为:
var folderName = "/Documents/PicScout";
2. 修正服务中的路径拼接逻辑
确保上传路径格式正确,避免重复斜杠:
public async Task UploadFileToOneDriveAsync(Stream fileStream, string UserId, string folderName, string fileName) { // 处理路径拼接,避免重复斜杠问题 var uploadPath = string.IsNullOrEmpty(folderName) ? fileName : $"{folderName.TrimEnd('/')}/{fileName.TrimStart('/')}"; try { await _graphClient.Users[UserId].Drive.Items["root"] .ItemWithPath(uploadPath) .Content .Request() .PutAsync<DriveItem>(fileStream); } catch(Exception ex) { // 添加日志便于调试,同时重新抛出异常让上层处理 Console.WriteLine($"上传失败:{ex.Message}"); throw; } }
3. 额外注意事项
- 权限验证:确保你的Azure AD应用已授予
Files.ReadWrite.All或Sites.ReadWrite.All的应用权限(因使用ClientSecretCredential属于应用级权限),且已完成管理员同意。 - Content-Type说明:上传文件内容时无需手动设置JSON Content-Type,Graph SDK会自动根据文件流匹配正确的类型;报错中提到的JSON要求仅针对DriveItem元数据修改请求,和文件上传无关。
- 异常处理:原代码捕获异常后无任何处理,建议添加日志并重新抛出,便于定位问题。
内容的提问来源于stack exchange,提问作者Mahesh Borhade
相关产品推荐
相关产品推荐

