CommentViewerCollection / MultiCommentViewer

いろんな配信サイトのコメントを表示できるコメビュです
https://ryu-s.github.io/app/multicommentviewer
GNU General Public License v3.0
180 stars 45 forks source link

YouTubeのコメントを取得中に頻繁に切断される #25

Closed ryu-s closed 5 years ago

ryu-s commented 5 years ago

2019/03/31頃から複数件の報告がある。 YouTubeサーバーの仕様変更だろうか。

ryu-s commented 5 years ago

今回の問題のエラーは以下のやつだと思う。

{"Ex":{"Name":"System.Net.WebException","Message":"要求は中止されました: 要求が取り消されました","StackTrace":"   場所 System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)\r\n   場所 System.IO.Stream.<>c.<BeginEndReadAsync>b__43_1(Stream stream, IAsyncResult asyncResult)\r\n   場所 System.Threading.Tasks.TaskFactory`1.FromAsyncTrimPromise`1.Complete(TInstance thisRef, Func`3 endMethod, IAsyncResult asyncResult, Boolean requiresSynchronization)\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.IO.Stream.<CopyToAsyncInternal>d__27.MoveNext()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Net.Http.StreamToStreamCopy.<>c.<DisposeSourceWhenCompleteAsync>b__1_0(Task completed, Object innerSource)\r\n   場所 System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke()\r\n   場所 System.Threading.Tasks.Task.Execute()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Net.Http.HttpContent.<LoadIntoBufferAsyncCore>d__49.MoveNext()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Net.Http.HttpClient.<FinishSendAsyncBuffered>d__58.MoveNext()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 SitePluginCommon.ServerBase.<GetInternalAsync>d__0.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\SitePluginCommon\\ServerBase.cs:行 53\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 YouTubeLiveSitePlugin.Test2.YouTubeLiveServer.<GetBytesAsync>d__6.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\YouTubeLiveSitePlugin\\Test2\\YouTubeLiveServer.cs:行 96\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 YouTubeLiveSitePlugin.Test2.ChatProvider.<ReceiveAsync>d__15.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\YouTubeLiveSitePlugin\\Test2\\ChatProvider.cs:行 56\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)\r\n   場所 YouTubeLiveSitePlugin.Test2.EachConnection.<ReceiveAsync>d__20.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\YouTubeLiveSitePlugin\\Test2\\EachConnection.cs:行 208","Timestamp":"2019/04/02 22:06:13","InnerError":null,"Properties":{"Message":"要求は中止されました: 要求が取り消されました","StackTrace":"   場所 System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)\r\n   場所 System.IO.Stream.<>c.<BeginEndReadAsync>b__43_1(Stream stream, IAsyncResult asyncResult)\r\n   場所 System.Threading.Tasks.TaskFactory`1.FromAsyncTrimPromise`1.Complete(TInstance thisRef, Func`3 endMethod, IAsyncResult asyncResult, Boolean requiresSynchronization)\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.IO.Stream.<CopyToAsyncInternal>d__27.MoveNext()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Net.Http.StreamToStreamCopy.<>c.<DisposeSourceWhenCompleteAsync>b__1_0(Task completed, Object innerSource)\r\n   場所 System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke()\r\n   場所 System.Threading.Tasks.Task.Execute()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Net.Http.HttpContent.<LoadIntoBufferAsyncCore>d__49.MoveNext()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Net.Http.HttpClient.<FinishSendAsyncBuffered>d__58.MoveNext()\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 SitePluginCommon.ServerBase.<GetInternalAsync>d__0.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\SitePluginCommon\\ServerBase.cs:行 53\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 YouTubeLiveSitePlugin.Test2.YouTubeLiveServer.<GetBytesAsync>d__6.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\YouTubeLiveSitePlugin\\Test2\\YouTubeLiveServer.cs:行 96\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 YouTubeLiveSitePlugin.Test2.ChatProvider.<ReceiveAsync>d__15.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\YouTubeLiveSitePlugin\\Test2\\ChatProvider.cs:行 56\r\n--- 直前に例外がスローされた場所からのスタック トレースの終わり ---\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   場所 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)\r\n   場所 YouTubeLiveSitePlugin.Test2.EachConnection.<ReceiveAsync>d__20.MoveNext() 場所 K:\\Programming\\workspace\\MultiCommentViewer\\YouTubeLiveSitePlugin\\Test2\\EachConnection.cs:行 208","HelpLink":null,"Source":"System"}},"Title":"","Detail":""},

このエラーは私の環境では再現されなかった。恐らくYouTubeサーバー内でのエラーが原因。4/1頃から2~3日の間だけ発生していたっぽいから、原因が解消されてから検証したせいだと思う。 しかもHttpClient.GetAsync()がWebExceptionを投げるのを想定していなかったから再接続機能が働かずにそのまま終了してしまったっぽい。

確実に問題が解決したかは未検証だけどとりあえずCloseしておく。