C# 使用Google Drive.NET API上载文件时,有时会出现空响应

C# 使用Google Drive.NET API上载文件时,有时会出现空响应,c#,.net,google-drive-api,google-api-dotnet-client,C#,.net,Google Drive Api,Google Api Dotnet Client,当我将一些文件发送到google drive时,有时会收到空响应 这种情况是随机发生的,大多数文件都会被发送,但每10个文件中就有1个返回null ResponseBody 我搜索了这个,但只有关于aways得到空响应的问题,以及 我的代码: await UploadFileAsync(...); //exception here public Task<string> UploadFileAsync(DriveService driveService, string LocalP

当我将一些文件发送到google drive时,有时会收到空响应

这种情况是随机发生的,大多数文件都会被发送,但每10个文件中就有1个返回null ResponseBody

我搜索了这个,但只有关于aways得到空响应的问题,以及

我的代码:

await UploadFileAsync(...); //exception here

public Task<string> UploadFileAsync(DriveService driveService, string LocalPath, string gdriveFileName, string GDriveFolder, IProgress<long> progress)
{
            return Task.Run(() =>
            {
                var folderId = GetDirectoryOrCreateIfNotExist(driveService, GDriveFolder);
                var file = CreateGDriveFile(gdriveFileName, folderId);

                IUploadProgress result = null;
                FilesResource.CreateMediaUpload request;
                using (var stream = new System.IO.FileStream(LocalPath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    request = driveService.Files.Create(file, stream, "image/jpeg");
                    request.ChunkSize = ResumableUpload.MinimumChunkSize * 4;

                    request.ProgressChanged += (p) => progress.Report(p.BytesSent * 100 / stream.Length);

                    request.Fields = "id, webContentLink, name";
                    result = request.Upload();
                }

                if (request == null)
                    throw new Exception("O request é nulo");

                if (request.ResponseBody == null)
                    throw new Exception("O ResponseBody é nulo"); //Throw here sometimes

                var fileUploaded = request.ResponseBody;

                return fileUploaded.WebContentLink;
            });
}

private string GetDirectoryOrCreateIfNotExist(DriveService driveService, string folderName)
        {
            var folder = GetFolderIdByName(driveService, folderName).FirstOrDefault();

            if (folder == null)
            {
                folder = CreateGDriveDirectory(driveService, folderName);
                AplyPermissionToFile(driveService, folder);
            }

            return folder;
        }

private File CreateGDriveFile(string fileName, string folderName = null)
        {
            var file = new File()
            {
                Name = fileName
            };

            if (folderName != null)
            {
                file.Parents = new List<string>
                {
                    folderName
                };
            }

            return file;
        }
更新代码:(参见result.Status!=UploadStatus.Completed)

public Task UploadFileAsync(DriveService-DriveService,string-LocalPath,string-gdriveFileName,string-GDriveFolder,IProgress-progress)
{
返回任务。运行(()=>
{
var folderId=getDirectoryCreateIfNotExist(驱动服务,GDriveFolder);
var file=CreateGDriveFile(gdriveFileName,folderId);
IUploadProgress结果=空;
FileResource.CreateMediaUpload请求;
使用(var stream=new System.IO.FileStream(LocalPath,System.IO.FileMode.Open,System.IO.FileAccess.Read))
{
request=driveService.Files.Create(文件、流、“图像/jpeg”);
request.ChunkSize=ResumableUpload.MinimumChunkSize*4;
request.ProgressChanged+=(p)=>progress.Report(p.BytesSent*100/流长度);
request.Fields=“id,webContentLink,name”;
结果=request.Upload();
}
如果(result.Status!=UploadStatus.Completed)//检查状态,现在它有时会抛出到这里
抛出结果异常;
if(请求==null)
抛出新异常(“O requesténulo”);
if(request.ResponseBody==null)
抛出新异常(“O ResponseBodyénulo”);
var fileupload=request.ResponseBody;
返回fileupload.WebContentLink;
});
}
有人能帮我吗?

你明白了,因为这是一个与你有关的问题。这种情况的发生是由于您试图发出的并发请求的数量

因此,在代码中,需要应用一些逻辑来避免该问题。例如:

如果请求失败,请等待1+随机数\u毫秒和秒 请重试该请求

如果请求失败,请等待2+随机数\u毫秒和秒 请重试该请求

如果请求失败,请等待4+随机数\u毫秒和秒 请重试该请求

以此类推,最多可达到最长的回退时间

其中:

等待时间为min((2^n)+随机数\u毫秒), 最大回退),每次迭代n增加1 (请求)

random_number_millides是一个小于毫秒的随机数 大于或等于1000。这有助于避免许多客户 在某些情况下进行同步,并立即重试,发送 同步波中的请求。价值 在每次重试请求后重新计算随机数\u毫秒

最大回退时间通常为32或64秒。适当的值 取决于用例

你之所以会这样,是因为这是一个与之相关的问题。这种情况的发生是由于您试图发出的并发请求的数量

因此,在代码中,需要应用一些逻辑来避免该问题。例如:

如果请求失败,请等待1+随机数\u毫秒和秒 请重试该请求

如果请求失败,请等待2+随机数\u毫秒和秒 请重试该请求

如果请求失败,请等待4+随机数\u毫秒和秒 请重试该请求

以此类推,最多可达到最长的回退时间

其中:

等待时间为min((2^n)+随机数\u毫秒), 最大回退),每次迭代n增加1 (请求)

random_number_millides是一个小于毫秒的随机数 大于或等于1000。这有助于避免许多客户 在某些情况下进行同步,并立即重试,发送 同步波中的请求。价值 在每次重试请求后重新计算随机数\u毫秒

最大回退时间通常为32或64秒。适当的值 取决于用例

根据的答案,我的代码现在可以工作了,如下所示:

    public Task<string> UploadFileAsync(DriveService driveService, string LocalPath, string gdriveFileName, string GDriveFolder, IProgress<long> progress)
    {
            return Task.Run(() =>
            {
                var folderId = GetDirectoryOrCreateIfNotExist(driveService, GDriveFolder);
                var file = CreateGDriveFile(gdriveFileName, folderId);

                IUploadProgress result = null;
                FilesResource.CreateMediaUpload request;
                using (var stream = new System.IO.FileStream(LocalPath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    request = driveService.Files.Create(file, stream, "image/jpeg");
                    request.ChunkSize = ResumableUpload.MinimumChunkSize * 4;

                    request.ProgressChanged += (p) => progress.Report(p.BytesSent * 100 / stream.Length);

                    request.Fields = "id, webContentLink, name";
                    result = request.Upload();

                    //solution: Truncated exponential backoff
                    if (result.Status != UploadStatus.Completed)
                    {
                        var rdn = new Random();
                        var waitTime = 0;
                        var count = 0;
                        do
                        {
                            waitTime = (Convert.ToInt32(Math.Pow(2, count)) * 1000) + rdn.Next(0, 1000);
                            Thread.Sleep(waitTime);

                            result = request.Upload();
                            count++;

                        } while (count < 5 && (result.Status != UploadStatus.Completed));
                    }//end solution
                }

                if (result.Status != UploadStatus.Completed)
                    throw result.Exception; //Doesn't get here anymore

                var fileUploaded = request.ResponseBody;

                return fileUploaded.WebContentLink;
            });
    }

public Task UploadFileAsync(DriveService-DriveService,string-LocalPath,string-gdriveFileName,string-GDriveFolder,IProgress-progress)
{
返回任务。运行(()=>
{
var folderId=getDirectoryCreateIfNotExist(驱动服务,GDriveFolder);
var file=CreateGDriveFile(gdriveFileName,folderId);
IUploadProgress结果=空;
FileResource.CreateMediaUpload请求;
使用(var stream=new System.IO.FileStream(LocalPath,System.IO.FileMode.Open,System.IO.FileAccess.Read))
{
request=driveService.Files.Create(文件、流、“图像/jpeg”);
request.ChunkSize=ResumableUpload.MinimumChunkSize*4;
request.ProgressChanged+=(p)=>progress.Report(p.BytesSent*100/流长度);
request.Fields=“id,webContentLink,name”;
结果=request.Upload();
//解决方案:截断指数回退
if(result.Status!=UploadStatus.Completed)
{
var rdn=新随机数();
var-waitTime=0;
var计数=0;
做
{
waitTime=(Convert.ToInt32(Math.Pow(2,count))*1000)+rdn.Next(011000);
public Task<string> UploadFileAsync(DriveService driveService, string LocalPath, string gdriveFileName, string GDriveFolder, IProgress<long> progress)
        {
            return Task.Run(() =>
            {
                var folderId = GetDirectoryOrCreateIfNotExist(driveService, GDriveFolder);
                var file = CreateGDriveFile(gdriveFileName, folderId);

                IUploadProgress result = null;
                FilesResource.CreateMediaUpload request;
                using (var stream = new System.IO.FileStream(LocalPath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    request = driveService.Files.Create(file, stream, "image/jpeg");
                    request.ChunkSize = ResumableUpload.MinimumChunkSize * 4;

                    request.ProgressChanged += (p) => progress.Report(p.BytesSent * 100 / stream.Length);

                    request.Fields = "id, webContentLink, name";
                    result = request.Upload();
                }

                if (result.Status != UploadStatus.Completed) //check status, now it's throwing here sometimes
                    throw result.Exception;

                if (request == null)
                    throw new Exception("O request é nulo");

                if (request.ResponseBody == null)
                    throw new Exception("O ResponseBody é nulo");

                var fileUploaded = request.ResponseBody;

                return fileUploaded.WebContentLink;
            });
        }
    public Task<string> UploadFileAsync(DriveService driveService, string LocalPath, string gdriveFileName, string GDriveFolder, IProgress<long> progress)
    {
            return Task.Run(() =>
            {
                var folderId = GetDirectoryOrCreateIfNotExist(driveService, GDriveFolder);
                var file = CreateGDriveFile(gdriveFileName, folderId);

                IUploadProgress result = null;
                FilesResource.CreateMediaUpload request;
                using (var stream = new System.IO.FileStream(LocalPath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    request = driveService.Files.Create(file, stream, "image/jpeg");
                    request.ChunkSize = ResumableUpload.MinimumChunkSize * 4;

                    request.ProgressChanged += (p) => progress.Report(p.BytesSent * 100 / stream.Length);

                    request.Fields = "id, webContentLink, name";
                    result = request.Upload();

                    //solution: Truncated exponential backoff
                    if (result.Status != UploadStatus.Completed)
                    {
                        var rdn = new Random();
                        var waitTime = 0;
                        var count = 0;
                        do
                        {
                            waitTime = (Convert.ToInt32(Math.Pow(2, count)) * 1000) + rdn.Next(0, 1000);
                            Thread.Sleep(waitTime);

                            result = request.Upload();
                            count++;

                        } while (count < 5 && (result.Status != UploadStatus.Completed));
                    }//end solution
                }

                if (result.Status != UploadStatus.Completed)
                    throw result.Exception; //Doesn't get here anymore

                var fileUploaded = request.ResponseBody;

                return fileUploaded.WebContentLink;
            });
    }