Я собрал приведенный ниже примерный код, используя вспомогательный код, который поставляется с примерами Google для его точечных чистых клиентских библиотек google api.Попытка выполнить простой тест API для Google Drive с использованием библиотеки dot dot net net и учетной записи службы
Проблема: он не перечисляет информацию о файлах, даже если я загрузил ее в учетную запись Gooogle, которой принадлежит эта учетная запись службы.
Когда я попытался использовать авторизацию oauth, чтобы сделать то же самое, я получил ожидаемый результат (я сделал это на этой странице: https://developers.google.com/drive/v2/reference/files/list).
Возможно, проблема с областью обзора или чем-то еще; есть идеи?
Мои попытки регистрации всех запросов и ответов HTTP полностью не удались. Похоже, что у клиентских библиотек Google есть регистрация на основе api-api, и я не вижу никаких данных для Google Drive. Кроме того, использование log4net с dotnetopenauth ничего не делало, когда я его пробовал (в клиентских библиотеках google используется функция net net open auth).
Вот код:
using System;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis.Drive.v2;
using Google.Apis.Util;
using Google.Apis.Services;
namespace Drive.ServiceAccount
{
class Program
{
static Program()
{
//
//ApplicationContext.RegisterLogger(new Log4NetLogger());
log4net.Config.XmlConfigurator.Configure();
}
private const string SERVICE_ACCOUNT_EMAIL = "<blablalba>@developer.gserviceaccount.com";
private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"<blablalba>-privatekey.p12";
/// <summary>
/// Build a Drive service object authorized with the service account.
/// </summary>
/// <returns>Drive service object.</returns>
static DriveService BuildService()
{
X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret",
X509KeyStorageFlags.Exportable);
var _client = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
{
ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
Scope = DriveService.Scopes.Drive.GetStringValue(),
};
var auth = new OAuth2Authenticator<AssertionFlowClient>(_client, AssertionFlowClient.GetState);
var service = new DriveService(new BaseClientService.Initializer()
{
Authenticator = auth,
ApplicationName = "Drive API Sample",
});
return service;
}
static void Main(string[] args)
{
var _driveService = BuildService();
var _files = _driveService.Files.List().Execute();
foreach (var _file in _files.Items)
{
Console.WriteLine(_file.Id);
}
Console.WriteLine("Done");
Console.ReadLine();
}
}
}
Благодаря Robadob для исправления моего недопонимания о служебных учетных записей. Вот некоторые рабочий код (только основной метод все остальное, как указано выше):
static void Main(string[] args)
{
String _newFileName = Guid.NewGuid().ToString() + ".xml";
new XDocument(new XElement("root", new XElement("someNode", "someValue")))
.Save(_newFileName);
Console.WriteLine("New file saved locally with name {0}.", _newFileName);
var _driveService = BuildService();
// upload the file:
//var uploadStream =
// new System.IO.FileStream(_newFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] byteArray = System.IO.File.ReadAllBytes(_newFileName);
MemoryStream _byteStream = new MemoryStream(byteArray);
var insert = _driveService.Files.Insert(new Google.Apis.Drive.v2.Data.File
{
Title = _newFileName,
}, _byteStream, "text/xml");
Task _uploadTask = insert.UploadAsync();
_uploadTask.ContinueWith(t => Console.WriteLine("Upload Task Completed"),TaskContinuationOptions.OnlyOnRanToCompletion);
//
try
{
_uploadTask.Wait();
}
catch (AggregateException _ex)
{
foreach (Exception ex in _ex.Flatten().InnerExceptions)
{
Console.WriteLine(ex.Message);
}
}
Console.WriteLine("Reading files");
var _files = _driveService.Files.List();
foreach (var _file in _files.Execute().Items)
{
Console.WriteLine(_file.Id);
}
Console.WriteLine("Done");
Console.ReadLine();
}
Черт, я слышал о олицетворении, но я подумал, что другая идея учетной записи службы заключается в том, что приложение может иметь свои собственные ресурсы и получать к ним доступ. – Elliot
Возможно, это может быть (я не использовал API приводов Google), однако в вашем вопросе вы говорите, что добавили файл пользователю, которому принадлежит учетная запись службы (а не учетная запись службы). Я не ожидал, что вы сможете получить доступ к файлам учетных записей служб не через API, поэтому попробуйте добавить файл через учетную запись службы через API. – Robadob
OK спасибо; теперь может быть ясно. Учетная запись службы отделена от учетной записи google, в консоли которой я создал учетную запись службы. Спасибо вам за помощь. – Elliot