0

Um die Aktualisierung einer Google Fusion-Tabelle zu automatisieren, haben wir eine .NET-Konsolenanwendung erstellt, der die Datei clientsecrets.json hinzugefügt und von der Google-Administrationskonsole heruntergeladen wurde.Oauth 2.0 für Fusion Tables API in .NET

Wenn ich die Anwendung lokal ausführe, öffnet sich ein Browserfenster, um die Verwendung der API mit OAuth 2.0 zu autorisieren. Sobald es den Prozess ordnungsgemäß autorisiert hat.

Wenn wir jedoch die Anwendung auf dem Server ausführen, auf dem die tägliche Ausführung geplant werden soll, wird das Browserfenster nicht geöffnet und "Ein oder mehrere Fehler treten auf".

Der Server ist ein Windows Server 2012. Die Anwendung auf dem 4.5.1 .NET integriert ist und den Code zur Ermächtigung ist wie folgt:

... 

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

Dies ist nur eine Vermutung, aber haben Sie versucht, 'HttpClientInitializer = erwarten Utils.Google.GetCredential()', anstatt sie zu zwingen, synchron laufen? Es ist eine häufige Ausnahmequelle. Obwohl es lokal gut läuft, möchten Sie es vielleicht überprüfen. –

+0

Stellen Sie sicher, dass jeder Benutzer, den Sie auf dem Server ausführen, Zugriff auf% appData% hat. Standard-Dateiatastore wird dort Anmeldeinformationen eingeben, wenn Sie es nicht anders angeben. – DaImTo

+0

Mein Tutorial zu FileDatastore könnte helfen http://www.daimto.com/google-net-filedatastore-demystified/ – DaImTo

Antwort

0

scheint, Sie brauchen ein Konto Service die erstellt werden können Von der Google "IAM and Admin" -Konsole: https://console.cloud.google.com/iam-admin/serviceaccounts. Sobald das Dienstkonto erstellt wurde, speichern Sie den privaten Schlüssel lokal (vorzugsweise als JSON-Datei) und erstellen Sie dann BaseClientService.Initializer aus den Anmeldeinformationen, die aus dieser Datei stammen. Etwas wie:

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

Mit solchen Initializer, nur die Instanz von FusiontablesService schafft fast wie damals:

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