GoogleWebAuthorizationBroker.AuthorizeAsync在释放到IIS7.0时超时

本文关键字:IIS7 0时 超时 释放 AuthorizeAsync GoogleWebAuthorizationBroker | 更新日期: 2023-09-27 18:01:08

在将代码发布到IIS7.0后,GoogleWebAuthorizationBroker.AuthorizeAsync出现问题。

通过我的开发环境,一切都按预期进行。我看到了Google权限屏幕,代码在App_data中创建了预期的令牌文件。然后我可以插入和更新日历条目。然而,当我发布代码时,我从GoogleWebAuthorizationBroker.AuthorizeAsync.收到一个请求超时错误

我已经手动将从开发环境中创建的令牌文件复制到web服务器上,代码运行良好。我可以在日历中创建事件。

我已经监控了防火墙,没有任何东西被阻止。

如果我删除了web服务器上的令牌文件的内容。我不会被提示重新授权并返回请求超时。

有人对出了什么问题有什么建议吗?

ClientSecrets client = new ClientSecrets
{
    ClientId = SessionState.SystemSettings[SystemSettingKey.GoogleAccountClientId].Value,
    ClientSecret = SessionState.SystemSettings[SystemSettingKey.GoogleAccountClientSecret].Value
};
IList<string> scopes = new List<string>();
scopes.Add(CalendarService.Scope.Calendar);
var credPath = HttpContext.Current.Server.MapPath("~/App_Data/");          
var credential =
    GoogleWebAuthorizationBroker.AuthorizeAsync(client, scopes, account, CancellationToken.None, new FileDataStore(credPath, true))
        .Result;
// Create the calendar service using an initializer instance
BaseClientService.Initializer initializer = new BaseClientService.Initializer
{
    HttpClientInitializer = credential,
    ApplicationName = "App1"
};

GoogleWebAuthorizationBroker.AuthorizeAsync在释放到IIS7.0时超时

我要在这里进行一次huntch的感觉,并说你自己有一个经典的死锁场景,因为你在这里阻塞了一个异步方法:

var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                              client, 
                              scopes, 
                              account,                         
                              CancellationToken.None,
                              new FileDataStore(credPath, true)).Result;

您不应该在异步方法上使用.Result,您应该始终使用await:异步等待

public async Task AuthorizeAsync()
{
   ClientSecrets client = new ClientSecrets
   {
       ClientId = SessionState.
                        SystemSettings[SystemSettingKey.GoogleAccountClientId].Value,
       ClientSecret = SessionState.
                        SystemSettings[SystemSettingKey.GoogleAccountClientSecret].Value
   };
   IList<string> scopes = new List<string>();
   scopes.Add(CalendarService.Scope.Calendar);
   var credPath = HttpContext.Current.Server.MapPath("~/App_Data/");  
   var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                                 client, 
                                 scopes, 
                                 account,
                                 CancellationToken.None,
                                 new FileDataStore(credPath, true));
   // Create the calendar service using an initializer instance
   BaseClientService.Initializer initializer = new BaseClientService.Initializer
   {
      HttpClientInitializer = credential,
      ApplicationName = "App1"
   };
}