私たちのウェブサイトは、コードビハインド(asp.net mvcアプリケーション)からビデオをYouTubeにアップロードする必要があります。 Googleの資格情報を取得しようとしていますが、AuthorizeAsyncを呼び出すと、アプリケーションがハングします。私は解決策を探し回ってみましたが、どれも役に立たないようです。私はすでに明白なグーグルとスタックオーバーフローを検索しました。ほとんどの場合、アプリケーションがappdataフォルダーにアクセスできない可能性があると述べたので、フォルダーをcドライブ、dドライブ、および実際のinetpubの場所に変更しました。テストしたところ、アプリケーションにそれらの場所への書き込みを実行できました。
具体的には、ユーザーが管理者で、顧客が動画をアップロードして、管理者が承認します。管理者が承認すると、YouTubeアカウントに投稿されます。管理者は何もする必要はありませんが、承認ボタンをクリックします。
これを実際の質問にするには、AuthorizeAsyncを回避するにはどうすればよいですか?さらに情報が必要な場合はお知らせください
UserCredential credential;
GoogleWebAuthorizationBroker.Folder = "YouTube.Auth.Store";
using (var stream = new FileStream(CredentialsPath, FileMode.Open,
FileAccess.Read))
{
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
// This OAuth 2.0 access scope allows an application to upload files to the
// authenticated user's YouTube channel, but doesn't allow other types of access.
new[] { YouTubeService.Scope.YoutubeUpload },
"user",
CancellationToken.None,
new FileDataStore("YouTube.Auth.Store")
).Result;
}
これに合格する方法を見つけました。
代わりにGoogleAuthorizationCodeFlowを使用しました。これは次のようになります。
ClientSecrets secrets = new ClientSecrets()
{
ClientId = CLIENT_ID,
ClientSecret = CLIENT_SECRET
};
var token = new TokenResponse { RefreshToken = REFRESH_TOKEN };
var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = secrets
}),
"user",
token);
var service = new YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credentials,
ApplicationName = "TestProject"
});
AuthorizeAsync
メソッドにはCancellationToken
が実装されているため、タイムアウトを使用するなどして、これが発生する可能性があります。
TokenSource
を作成して、トークン自体を取得します。AuthorizeAsync
メソッドに渡すトークンを抽出します。public async void RunAsync()
{
UserCredential credential;
var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read);
CancellationTokenSource cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(20));
CancellationToken ct = cts.Token;
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] { YouTubeService.Scope.YoutubeUpload },
"user",
ct
);
if (ct.IsCancellationRequested) return;
// do more stuff when came back authorized.
}
20秒後、AuthorizeAsync
がnotになったときに、このメソッドの呼び出し元RunAsync
が例外を受け取ります。
try
{
await RunAsync();
}
catch(Exception)
{
// "Timeout" of the RunAsync();
}
GoogleWebAuthorizationBroker.Folder = "YouTube.Auth.Store";
この行により、YouTube.Auth.Store/xxxにアクセストークンが生成されます。右クリックする必要がありますこのファイル->プロパティ->出力ディレクトリにコピー->常にコピービジュアルスタジオ
わたしにはできる。