在C#Windows服务应用程序中使用Google Drive Api

brccelvz  于 2022-10-08  发布在  C#
关注(0)|答案(1)|浏览(170)

我有两个相互关联的不同项目。

在我的第一个项目(WinForms)中,用户创建自己的计划并进行一些应用程序设置(时间表、邮件帐户设置、SQL连接等)。

我的第二个项目(C#Windows Service)按照第一个项目中的时间表进行数据库备份、压缩并使用SQL Connection向用户发送电子邮件。到目前为止还没有问题。

我想通过Google Drive Api发送压缩的数据库备份。

当我在WinForms应用程序中运行示例代码时,一个浏览器被触发,并要求我登录到Google帐户。然后它就可以正常工作了。但同样的代码在我的Windows服务应用程序中不起作用。我认为我没有获得权限,因为没有触发浏览器。您认为实施此方案的最佳方式是什么?

请帮帮忙。我正在分享下面的示例代码。

private static UserCredential GetCredentials()
    {
        UserCredential credential;
        using (var stream =
               new FileStream("C:/MyApp/GoogleApis/credentials.json", FileMode.Open, FileAccess.Read))
        {
            string credPath = "token.json";
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.FromStream(stream).Secrets,
                Scopes,
                "user",
                CancellationToken.None,
                new FileDataStore(credPath, true)).Result;
            Console.WriteLine("Credential file saved to: " + credPath);
        }
    }

    private static void UploadBasicFile(string path, DriveService service)
    {
        var fileMetadata = new Google.Apis.Drive.v3.Data.File();
        fileMetadata.Name = Path.GetFileName(path);
        fileMetadata.MimeType = "image/jpeg";
        FilesResource.CreateMediaUpload request;
        using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open))
        {
            request = service.Files.Create(fileMetadata, stream, "image/jpeg");
            request.Fields = "id";
            request.Upload();
        }

        var file = request.ResponseBody;

    }
  • 同一解决方案中不存在项目。谢谢你的帮助。
57hvy0tb

57hvy0tb1#

我认为我没有获得权限,因为没有触发浏览器。

这正是正在发生的事情。Windows服务在后台运行,因此不会提示用户对应用程序进行身份验证。

你的WinForms应用程序在用户的机器上运行,我想Windows服务可能也在用户的机器上破坏。这意味着Windows服务应该能够读取与WinForms应用程序相同的授权码。

问题是,为什么不是呢?

让我们来看看您的代码。

这是安装了应用程序的OAuth2的一个非常标准的示例。默认情况下,它使用FileDataStore存储用户凭据。在名称为“User”的CredPath中

credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.FromStream(stream).Secrets,
            Scopes,
            "user",
            CancellationToken.None,
            new FileDataStore(credPath, true)).Result;
        Console.WriteLine("Credential file saved to: " + credPath);

假设您使用的是完全相同的代码,Windows服务应该会使用它。如果不是,那么我猜这是Windows服务的权限,它需要从该目录读取的权限。

因此,首先要做的是。

1.检查以确保您在Windows服务中使用完全相同的凭据路径和“用户”。
1.检查Windows服务是否可以读取redPath中的文件。

正确配置后,您的用户应该只需要通过WinForms授权您的应用程序,Windows服务应该能够从中读取用户凭据。

相关问题