Estoy tratando de usar la API de Google Drive desde una aplicación asp.net para cargar archivos.
Problema: el código funciona localmente, pero cuando se carga en el servidor no sucede nada (la página sigue cargando... no se muestra la pantalla de consentimiento. Se agradece la ayuda. Se puede escribir en la carpeta "UploadedPdf" y client_secrets.json existe en la carpeta.
NOTA: No instalé nada en el servidor, solo cargué todos los archivos incluidos los dll de la API de Google en la carpeta bin del servidor.
UserCredential credential; using (var filestream = new FileStream(Server.MapPath("UploadedPdf/client_secrets.json"), FileMode.Open, FileAccess.Read)) { credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(filestream).Secrets, new[] { DriveService.Scope.Drive }, "user", CancellationToken.None, new FileDataStore(Server.MapPath("UploadedPdf/"))).Result; } // Create the service. var service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Drive API Sample", }); Google.Apis.Drive.v2.Data.File body = new Google.Apis.Drive.v2.Data.File(); body.Title = "My document"; body.Description = "A test document"; body.MimeType = "text/plain"; byte[] byteArray = System.IO.File.ReadAllBytes(Server.MapPath("UploadedPdf/sample.txt")); System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray); FilesResource.InsertMediaUpload request = service.Files.Insert(body, stream, "text/plain"); request.Upload(); Google.Apis.Drive.v2.Data.File file = request.ResponseBody;FileDatastore coloca los archivos de forma predeterminada en %appData%. Normalmente haría algo como. (supongamos que también uso "usuario")
new FileDataStore("Console.Analytics.Auth.Store")Luego, cuando lo llamo, aparece un directorio llamado
%AppData%\Roaming\Console.Analytics.Auth.Storeen ese directorio ahora vive un archivo llamado
Google.Apis.Auth.OAuth2.Responses.TokenResponse-userno he probado que hacer
new FileDataStore(Server.MapPath("UploadedPdf/"))lo hará, pero supongo que obtendrá un directorio llamado
%AppData%\Roaming\serverpat/uploadpdf/Que no creo que sea lo que buscas. Si eso es realmente lo que está tratando de hacer, ¿ha hecho que se pueda escribir en ese directorio? Es posible que desee considerar el uso de LocalFileDataStore en su lugar.
No estoy seguro si este es tu problema o no.
También recuerde que está codificando "usuario" por lo que técnicamente su código le pedirá que se autentique una vez para "usuario" después de eso, tiene la autenticación en ese archivo para "usuario", por lo que no hay razón para solicitarlo nuevamente.
Creo que estás llamando mal a AuthorizeAsync(). Utilice la palabra clave await y el control remoto .Result. Tendrá que marcar el método como asíncrono para hacer esto.
También sugeriría usar el método UploadAsync() en su lugar. Tampoco necesita cargar todo el archivo en la memoria con ReadAllBytes(). Simplemente use File.OpenRead() y pase FileStream en lugar de MemoryStream.
Google tiene un código de ejemplo:https://developers.google.com/api-client-library/dotnet/guide/media_upload
Su código sugiere que está utilizando el flujo de trabajo/credenciales de "Aplicación instalada", que se supone que funciona bien si está ejecutando su aplicación ASP.NET localmente. Sin embargo, cuando mueve el mismo código a un servidor web, ya no es una aplicación instalada. Entra en la categoría de "Aplicación Web".
Debe ir a Google Developer Console->Credentials->Create New Client ID y generar un nuevo conjunto de credenciales para su aplicación web. También debe cambiar el flujo de OAuth según esta guía:
https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-aspnet-mvc