YouTubeC#APIV3,如何恢复中断的上传?我不知道如何在C#YouTubeAPI的V3中恢复中断的上传。我现有的代码使用V1并且工作正常,但我正在切换到V3。如果我在不更改任何内容的情况下调用UploadAsync(),它将从头开始。使用Fiddler,我可以看到没有遵循此处给出的协议,上传重新开始。我已尝试按照V1设置流中的位置,但没有可用的ResumeAsync()方法。Python示例使用NextChunk,但SendNextChunk方法受保护且在C#中不可用。在下面的代码中,如果我完成UploadVideo()和Resume()都可以正常工作,但上传整个视频而不是仅上传其余视频。如何使用google.apis.youtube.v3恢复中断的上传?这是我到目前为止尝试过的C#代码。privateResumableUploadUploadVideo(YouTubeServiceyouTubeService,Videovideo,Streamstream,UserCredentialuserCredentials){varresumableUpload=youTubeService.Videos.Insert(video,"snippet,status,contentDetails",stream,"video/*");resumableUpload.OauthToken=userCredentials.Token.AccessToken;resumableUpload.C??hunkSize=256*1024;resumableUpload.ProgressChanged+=resumableUpload_ProgressChanged;resumableUpload.ResponseReceived+=resumableUpload_ResponseReceived;resumableUpload.UploadAsync();返回可恢复上传;}privatevoidResume(ResumableUploadresumableUpload){//我试过像V1一样寻找但它不起作用//if(resumableUpload.C??ontentStream.CanSeek)//resumableUpload.C??ontentStream.Seek(resumableUpload.C??ontentStream.Position,SeekOrigin.Begin);resumableUpload.UploadAsync();//<----这将重新开始上传}voidresumableUpload_ResponseReceived(Videoobj){Debug.WriteLine("Videostatus:{0}",obj.Status.上传状态);}voidresumableUpload_ProgressChanged(IUploadProgressobj){Debug.WriteLine("Position:{0}",(resumableUploadTest==null)?0:resumableUploadTest.ContentStream.Position);Debug.WriteLine("状态:{0}",obj.Status);Debug.WriteLine("发送的字节数:{0}",obj.BytesSent);}privatevoidbutton2_Click(objectsender,EventArgse){Resume(resumableUploadTest);任何解决方案/建议/演示或“google.apis.youtube.v3”源代码的链接都将非常有用提前致谢!编辑:新信息我还在努力,我相信API还没有完成。要么,要么我错过了一些简单的东西。我仍然找不到“google.apis.youtube.v3”源代码,所以我下载了最新的“google-api-dotnet-client”源代码。它包含YouTubeAPI使用的ResumableUpload类。我通过跳过UploadAsync()方法中的前四行代码成功地继续上传。我创建了一个名为ResumeAsync()的新方法,它是UploadAsync()的副本,删除了前四行初始化代码。一切正常,上传从其原始位置恢复并完成。我不想更改API中的代码,所以如果有人知道我应该如何使用它,请告诉我。我会继续插电,看看是否能解决问题。这是原始的UploadAsync()方法和我的ResumeAsync()hack。publicasyncTaskUploadAsync(CancellationTokencancellationToken){try{BytesServerReceived=0;UpdateProgress(newResumableUploadProgress(UploadStatus.Starting,0));//检查流长度是否已知。StreamLength=ContentStream.CanSeek?ContentStream.Length:UnknownSize;UploadUri=awaitInitializeUpload(cancellationToken).ConfigureAwait(false);Logger.Debug("MediaUpload[{0}]-开始上传...",UploadUri);使用(varcallback=newServerErrorCallback(this)){while(!awaitSendNextChunkAsync(ContentStream,cancellationToken).ConfigureAwait(false)){UpdateProgress(newResumableUploadProgress(UploadStatus.Uploading,BytesServerReceived));}UpdateProgress(newResumableUploadProgress(UploadStatus.Completed,BytesServerReceived));}}catch(TaskCanceledExceptionex){Logger.Error(ex,"MediaUpload[{0}]-任务被取消",UploadUri);UpdateProgress(新的ResumableUploadProgress(例如,BytesServerReceived));扔前;}赶上(Exceptionex){Logger.Error(ex,"MediaUpload[{0}]-上传媒体时发生异常",UploadUri);UpdateProgress(新的ResumableUploadProgress(例如,BytesServerReceived));}返回进度;}publicasyncTaskResumeAsync(CancellationTokencancellationToken){try{using(varcallback=newServerErrorCallback(this)){while(!awaitSendNextChunkAsync(ContentStream,cancellationToken).ConfigureAwait(false)){UpdateProgress(newResumableUploadProgress(UploadStatus.Uploading,BytesServerReces}ivedate))newResumableUploadProgress(UploadStatus.Completed,BytesServerReceived));}}catch(TaskCanceledExceptionex){UpdateProgress(newResumableUploadProgress(ex,BytesServerReceived));扔前;;}返回进度;这些是显示恢复上传的Fiddler日志想来想去,我决定修改API代码。我的解决方案保持向后兼容性。我在下面记录了我的更改,但我不建议使用它们。在“Google.Apis.Upload”的ResumableUpload类的UploadAsync()方法中,我替换了这段代码。字节服务器接收=0;UpdateProgress(newResumableUploadProgress(UploadStatus.Starting,0));//检查流长度是否已知。StreamLength=ContentStream.CanSeek?ContentStream.Length:UnknownSize;UploadUri=awaitInitializeUpload(cancellationTokenA));使用此代码UpdateProgress(newResumableUploadProgress(BytesServerReceived==0?UploadStatus.Starting:UploadStatus.Resuming,BytesServerReceived));StreamLength=ContentStream.CanSeek?ContentStream.Length:UnknownSize;如果(UploadUri==null)(cancellationToken).ConfigureAwait(false);我还公开了UploadUri和BytesServerReceived属性。这允许在ResumableUpload对象被销毁或应用程序重新启动后继续上传。您只需像往常一样重新创建ResumableUpload,设置这两个字段并调用UploadAsync()以恢复上传。在原始上传过程中,需要保留这两个字段。公共UriUploadUri{得到;放;}publiclongBytesServerReceived{get;放;我还在IUploadProgress类的UploadStatus枚举中添加了“Resuming”。publicenumUploadStatus{//////上传尚未开始。///NotStarted,//////上传正在初始化。///开始,//////正在上传数据。///正在上传,//////正在恢复上传。///正在恢复,//////上传成功完成。///已完成,//////上传失败。///失败的};不作任何更改开始上传。如果ResumableUpload对象和流没有被销毁,再次调用UploadAsync()以恢复中断的上传。如果它们已被销毁,则创建新对象并设置UploadUri和BytesServerReceived属性。这两个属性都可以在原始上传期间保存。视频详细信息和内容流可以正常配置。这些更改允许即使在重新启动应用程序或重新启动后也可以继续上传。我不确定上传过期还有多久,但是当我用我的真实应用程序做更多测试时我会报告。为了完整起见,这是我一直用来在上传过程中多次重启应用程序后非常快速地恢复中断上传的测试代码。resume和restart之间的唯一区别是设置UploadUri和BytesServerReceived属性。resumableUploadTest=youTubeService.Videos.Insert(video,"snippet,status,contentDetails",fileStream,"video/*");如果(恢复){resumableUploadTest.UploadUri=Settings.Default.UploadUri;resumableUploadTest.BytesServerReceived=Settings.Default。字节服务器已接收;}resumableUploadTest.ChunkSize=ResumableUpload.MinimumChunkSize;resumableUploadTest.ProgressChanged+=resumableUpload_ProgressChanged;resumableUploadTest.UploadAsync();我希望这可以帮助别人。我花了比预期更长的时间来弄清楚,我仍然希望我错过了一些简单的东西。多年来,我一直在尝试添加我自己的错误处理例程,但API会为您完成所有这些工作。API确实可以从短暂的小问题中恢复,但不能从应用程序重新启动、重新启动或长时间中断中恢复。干杯。米克。我已经设法使用反射来做到这一点,而根本没有修改API。为了完整起见,我将记录该过程,但不推荐这样做。在可恢复上传对象中设置私有属性不是一个好主意。当可恢复上传对象在应用程序重启或重新启动后被销毁时,您仍然可以使用Google.Apis.YouTube.v3客户端库的版本“1.8.0.960-rc”恢复上传。privatestaticvoidSetPrivateProperty(Objectobj,stringpropertyName,objectvalue){varpropertyInfo=typeof(T).GetProperty(propertyName,BindingFlags.NonPublic|BindingFlags.Instance);如果(propertyInfo==null)返回;propertyInfo.SetValue(obj,value,null);}privatestaticobjectGetPrivateProperty(Objectobj,stringpropertyName){if(obj==null)returnnull;varpropertyInfo=typeof(T).GetProperty(propertyName,BindingFlags.NonPublic|BindingFlags.Instance);返回propertyInfo==null?null:propertyInfo.GetValue(obj,null);您需要在ProgressChanged事件期间保存UploadUri。Upload.ResumeUri=GetPrivateProperty>(InsertMediaUpload,"UploadUri")作为Uri;在调用ResumeAsync之前,您需要设置UploadUri和StreamLength。privateconstlongUnknownSize=-1;SetPrivateProperty>(InsertMediaUpload,"UploadUri",Upload.ResumeUri);SetPrivateProperty>(InsertMediaUpload,"StreamLength",fileStream.CanSeek?fileStream.Length:Constants.UnknownSize);CancellationTokenSource.Token);此问题已在Google.Apis.YouTube.v3客户端库的版本“1.8.0.960-rc”中得到解决。他们添加了一个名为ResumeAsync的新方法,它运行良好。我希望我知道他们正在努力。我需要解决的一个小问题是在重新启动应用程序或重新启动后恢复上传。当前的API不允许这样做,但有两个小改动修复了它。我向接受并设置原始UploadUri的ResumeAsync方法添加了一个新签名。需要初始化StreamLength属性以避免溢出错误。publicTaskResumeAsync(UriuploadUri,CancellationTokencancellationToken){UploadUri=uploadUri;StreamLength=ContentStream.CanSeek?ContentStream.Length:UnknownSize;返回ResumeAsync(取消令牌);它。以上是C#学习教程:YouTubeC#APIV3,如何恢复中断的上传?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——publicUriUploadUri{get;私有集;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
