【问题标题】:YouTube API upload "A task was cancelled"YouTube API 上传“任务已取消”
【发布时间】:2016-03-18 21:07:06
【问题描述】:

我们已经运行了一年多的服务,该服务使用 API v3 Upload(使用 .NET 库 Google.Apis.YouTube.v3)将视频上传到 YouTube。

在过去的两天里,我们突然开始在上传过程中出现所有上传失败的情况,YouTube 返回错误“任务已取消”。这些视频部分上传到 YouTube,它们正在经历不同的进展(有些只有几 MB,有些则高达 17-20MB,尽管似乎较大的进度出现在较早的失败列表中)。

这首先发生在周五晚上,我能够在周六早上顺利推送所有失败的视频,但随后在周六早上再次开始,并且从那时起,周六下午和晚上的所有视频都失败了。我们谈论的视频总共有 25 个左右,而不是数百个。这些视频的大小都在 40MB 左右。

一次通常只会上传 2-3 个视频。虽然我在周六早上成功地将它们全部推高,但实际上我一次推高了大约 4-5 个。

其他人能否提出可能的原因或任何故障排除提示?否则,我们没有看到任何服务器连接问题,并且在该服务器上运行的网站没有任何明显的问题。除了来自 YouTube 的“A task was cancelled”错误之外,我看不到任何其他错误返回,并且在该错误之前,上传者的进度是成功的。

编辑:我还能够在我的开发环境中运行我们的一个上传文件来重现此问题。我刚刚尝试获取一组全新的 API 凭据(实际上是针对不同的 YouTube 帐户),刷新了 oAuth 令牌,但仍然遇到同样的问题。

【问题讨论】:

  • 我的应用程序的几个客户来自世界各地。我没有更改任何代码,但我在最近的版本中更新了 API。我可以在我的开发机器上重现该问题,但我还没有开始调查,只是发现它来自于进度更改事件中的 API,而不是我的代码。
  • 我想我已经确定了问题所在。增加 YouTubeService.HttpClient.Timeout 有望为我修复它。默认值为 1 分 40 秒。目前似乎将其提高到 10 分钟。我会让它用户可调。从 API 返回的异常是“任务取消异常”,就像用户为我取消上传一样,所以我需要以某种方式解决这个问题。
  • 您,先生,是个传奇!我已经到了每天早上只使用变通方法来运行上传的地步(当它在 95% 的时间内工作时)。因此,听起来好像 YouTube 服务器可能需要比平时更长的时间来响应上传,因此出现了问题(显然在一天中的某些时间它比其他时间更忙,因此它通常在早上工作)。您是否在使用 .NET 库,如果是,您在哪里设置此超时?你介意分享它吗(也许作为一个答案,因为如果它有效,我会想把它标记为答案)?谢谢!
  • 您是否发现超时更改解决了您的问题?如果是这样,您介意分享您的解决方案吗?我一直在努力让它工作,因为使用异步方法似乎不会将更改持续到超时值。
  • 有人可以分享在哪里更改超时吗?我不知道。 @米克

标签: file-upload youtube youtube-data-api


【解决方案1】:

您需要在使用服务之前设置超时,如果用户更改它,您需要暂停所有上传,将服务清空并重新初始化。

我很确定我可以确认设置 YouTubeService.HttpClient.Timeout 确实可以解决问题。

抱歉,我的回复延迟。

internal YouTubeService YouTubeService { get; set; }

internal async Task InitialiseYouTubeServiceAsync(int timeoutSeconds)
{

    var scope = new List<string> { YouTubeService.Scope.YoutubeUpload, YouTubeService.Scope.Youtube, };
    var clientSecrets = new ClientSecrets()
    {
        ClientId = Constants.ClientId,
        ClientSecret = Constants.ClientSecret
    };

    var fileDataStore = new FileDataStore(Constants.FileDataStore);         

    try
    {

        var credentialTask = GoogleWebAuthorizationBroker.AuthorizeAsync(
            clientSecrets, scope, Environment.UserName, CancellationToken.None, fileDataStore);

        //This is a hack to allow a progress bar timeout when the user closes the 
        //browser without authorising. It's not associated with the question at hand.
        await Task.WhenAny(credentialTask, Task.Delay(TimeSpan.FromSeconds(timeoutSeconds)));

        if (credentialTask.Status == TaskStatus.WaitingForActivation) return;

        var initializer = new BaseClientService.Initializer()
        {
            HttpClientInitializer = credentialTask.Result,
            ApplicationName = Constants.ApplicationName,                    
        };

        YouTubeService = new YouTubeService(initializer);               

        //This is the answer to the question at hand.
        YouTubeService.HttpClient.Timeout = TimeSpan.FromMinutes(Settings.Default.TimeoutMinutes);              

    }
    catch (AggregateException)
    {
        Exceptions.LogSilent(new Exception(ResourceExceptions.AuthorisationDenied), MethodBase.GetCurrentMethod(), EventLogEntryType.Information);
    }

}

【讨论】:

  • 我的应用程序的用户已确认此处显示的超时更改已为他们解决了问题。
  • 对不起,我延迟返回这个......但我很高兴地报告设置超时(这在我的代码中是一件简单的事情,我最初只是做错了)有效我也一样,再次感谢!
  • 感谢您的示例代码和您对“任务已取消”问题的解释。我本周开始看到这种情况发生。在不同地方多次重试失败后,我决定搜索 SO 并找到您的解决方案。我几分钟前开始上传,已经看到 02:43 和 06:18 的响应延迟。默认超时 01:40 为我工作了好几年,但在过去的几天里,我收到了几次“任务取消”失败。将超时设置为较大的值(10 分钟)似乎已经解决了这个问题。我猜 YouTube 的上传服务器现在非常繁忙。
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 2013-08-13
  • 2022-01-10
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多