You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:31:41