0

要自動更新Google Fusion Table,我們創建了一個.NET控制檯應用程序,我們在其中附加了從Google管理控制檯生成並下載的文件clientsecrets.json。Oauth 2.0適用於.NET中的Fusion Tables API

當我在本地運行應用程序時,會打開一個瀏覽器窗口來授權將API與OAuth 2.0一起使用。一旦授權該流程正確執行。

但是,當我們在要安排日常執行的服務器上運行應用程序時,不會打開瀏覽器窗口並指出「發生一個或多個錯誤」。

的服務器是Windows Server 2012的應用程序建立在.NET 4.5.1和授權代碼如下:

... 

var service = new FusiontablesService(new BaseClientService.Initializer 
{ 
    ApplicationName = "Fusion Tables Sample", 
    HttpClientInitializer = Utils.Google.GetCredential().Result 
}); 

... 

public static async Task<UserCredential> GetCredential() 
{ 
    using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) 
    { 
     return await GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       new[] { FusiontablesService.Scope.Fusiontables }, 
       "XXXXXXXXXXXX[user]", CancellationToken.None); 
    } 
} 
+0

這僅僅是一種預感,但你試過'HttpClientInitializer =等待的Utils.Google.GetCredential()'而不是強迫它同步運行?這是一個常見的例外情況。雖然它在本地運行良好,但您可能需要檢查它。 –

+0

確保你在服務器上運行的用戶有權訪問%appData%default filedatastore將要把證書放在那裏,除非你另有說明。 – DaImTo

+0

我的FileDatastore教程可能有助於http://www.daimto.com/google-net-filedatastore-demystified/ – DaImTo

回答

0

看來你需要一個可以創建服務帳戶來自Google「IAM和Admin」控制檯:https://console.cloud.google.com/iam-admin/serviceaccounts。創建服務帳戶後,請將其私鑰保存在本地(最好是JSON文件),然後從此文件獲取的憑證中創建BaseClientService.Initializer,例如:

var scopes = new[] { FusiontablesService.Scope.Fusiontables }; 
using (var stream = new FileStream(keyFilePath, FileMode.Open, FileAccess.Read)) 
{ 
return GoogleCredential.FromStream(stream) 
.CreateScoped(scopes); 
} 

有這樣的初始化程序,只需創建FusiontablesService的實例幾乎像你一樣:

 service = new FusiontablesService(
      new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = creds, 
       ApplicationName = "Street Parking", 
      });