我正在编写一个可以将其输出复制到用户Google云端硬盘的C#桌面应用。但是,当我尝试使用GoogleWebAuthorizationBroker.AuthorizeAsync()授权访问Google时,如果用户在浏览器中关闭了身份验证页面,则该方法永远不会返回!
即使我使用了30秒的取消令牌,如果浏览器关闭,它也永远不会返回。
public bool Authorise()
{
_authorised = false;
UserCredential credential = null;
try
{
// here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%
CancellationTokenSource cts = new CancellationTokenSource(new TimeSpan(0,0,30));
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = this.ClientId, ClientSecret = this.ClientSecret },
Scopes,
UserName,
cts.Token,//CancellationToken.None,
new FileDataStore(AppName)).Result;
}
catch (Exception)
{
return _authorised;
}
if ((credential != null) && (credential.Token.AccessToken != null))
{
Service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = AppName, });
_authorised = true;
}
return _authorised;
}
如何捕获用户关闭浏览器窗口并停止我的应用程序挂起?
答案 0 :(得分:2)
这是Google .net客户端库中的已知问题。
答案 1 :(得分:0)
通常,检测用户何时关闭浏览器窗口/选项卡是不可能的。 例如,如果用户已在运行其默认浏览器,则GoogleWebAuthorizationBroker会打开一个新标签,但这不会在LocalServerCodeReceiver中启动的过程中运行。新流程立即终止。
然而,目前传递给GoogleWebAuthorizationBroker.AuthorizeAsync的CancellationToken在等待auth响应时并不受尊重,这意味着即使尝试使用简单的超时也不起作用。 #968提出要解决此问题。
答案 2 :(得分:0)
您可以使用BackgroundWorker
进行修复。
如果浏览器已关闭,则background_RunWorkerCompleted
将被触发。
别忘了使用FileDataStore
,
因为您无法从BackgroundWorker
获取凭据变量。
答案 3 :(得分:0)
我能够通过将API调用添加到其他线程来解决此问题,这避免了主应用程序挂起。然后添加超时或特定条件以关闭线程