.Net应用调用drive.files.create失效返回NULL,求排查解决办法
问题描述
基于.Net的应用通过Google Drive API V3(版本1.58.0.2859)向Google Drive上传文件,自11月29日起突然失效,期间未做任何变更,具体现象如下:
- 调用API的服务账号有效(用于其他Google API正常运行)
- 目标Drive文件夹已设置为“任意有链接者可编辑”,排除基础权限问题
- API调用返回NULL,无明确错误码及信息,但GCP“按API方法统计错误”图表显示
drive.files.create失败率100% - 特殊现象:禁用再重新启用Google Drive API后可成功上传一次,之后再次失效
- 从响应的
progress属性中发现错误信息:"The user's Drive storage quota has been exceeded.",但使用的是无存储限制的Google Workspace企业版,服务账号及密钥均正常,GCP无相关报错
相关代码:
private string SaveFileToGoogleDrive(IFormFile file, string claimNumber) { try { var driveService = GetDriveServiceInstance(); var fileMetadata = new Google.Apis.Drive.v3.Data.File(); var mimeType = file.ContentType; fileMetadata.Name = CreateFileName(file.FileName, claimNumber); fileMetadata.MimeType = mimeType; fileMetadata.Parents = new List<string> { _googleSettings.GoogleDriveFolderId }; FilesResource.CreateMediaUpload request; using (var stream = new MemoryStream()) { file.CopyTo(stream); request = driveService.Files.Create(fileMetadata, stream, mimeType); request.Fields = "id"; request.Upload(); } var googleFile = request.ResponseBody; // 问题发生后,响应体始终为NULL return googleFile.Id; } catch(Exception ex) { _logger.Error($"Google Drive exception {ex.Message} STACKTRACE: {(ex.StackTrace ?? "")} INNER EXCEPTION: {(ex.InnerException != null ? ex.InnerException.Message + "STACK TRACE:" + ex.InnerException.StackTrace ?? "" : "")}"); return string.Empty; } }
排查方向及解决办法
1. 验证服务账号的存储配额归属与实际限制
- 确认服务账号是否属于Google Workspace域的正式成员:企业版无存储限制仅针对域内身份,若服务账号未正确关联到域,可能会被限制在个人账号的配额内
- 联系Workspace管理员检查域内Drive设置:部分企业会对团队盘、共享盘设置单独配额,或针对服务账号启用特殊存储限制,排查目标文件夹所在的存储容器是否存在配额限制
- 直接查询服务账号的Drive配额:调用
drive.about.get接口,设置fields="storageQuota",获取实际配额使用情况,确认是否真的超限
2. 升级Google Drive API客户端库
当前使用的1.58.0.2859版本发布时间较早,可能存在与Google Drive API最新服务端逻辑不兼容的问题,导致错误信息无法正常抛出,仅返回NULL:
- 升级NuGet包
Google.Apis.Drive.v3至最新稳定版本 - 升级后重新测试上传逻辑,观察是否能捕获到更明确的错误信息
3. 优化API调用的错误捕获逻辑
当前代码仅捕获全局Exception,但Google的CreateMediaUpload.Upload()方法在部分错误场景下不会抛出异常,而是将错误信息存储在request.Error中,需补充状态检查:
// 在request.Upload()后添加以下代码 if (request.Status != Google.Apis.Upload.UploadStatus.Completed) { var errorMsg = request.Error?.Message ?? "Unknown upload error"; _logger.Error($"Google Drive upload failed: {errorMsg}"); return string.Empty; }
通过该逻辑可直接获取API返回的原始错误信息,辅助定位问题。
4. 排查API权限与缓存问题
- 检查服务账号的IAM角色:确认服务账号被授予了足够的Drive权限(如
Editor或Drive File Creator角色),避免仅靠文件夹链接权限导致的访问异常 - 重新生成服务账号密钥:替换现有密钥后测试,排除密钥过期或权限缓存异常的问题
- 清除本地客户端缓存:部分客户端库会缓存API状态,清理缓存后重新启动应用测试
5. 验证目标文件夹的实际访问权限
- 使用服务账号调用
drive.files.list接口,尝试列出目标文件夹下的文件,确认服务账号确实拥有该文件夹的读写权限 - 检查文件夹的共享设置:确保“任意有链接者可编辑”的设置已正确应用,且未被域内的组织策略覆盖
内容的提问来源于stack exchange,提问作者Lu Xin
相关产品推荐
相关产品推荐

