我有两个相互关联的不同项目。
在我的第一个项目(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;
}
- 同一解决方案中不存在项目。谢谢你的帮助。
1条答案
按热度按时间57hvy0tb1#
我认为我没有获得权限,因为没有触发浏览器。
这正是正在发生的事情。Windows服务在后台运行,因此不会提示用户对应用程序进行身份验证。
你的WinForms应用程序在用户的机器上运行,我想Windows服务可能也在用户的机器上破坏。这意味着Windows服务应该能够读取与WinForms应用程序相同的授权码。
问题是,为什么不是呢?
让我们来看看您的代码。
这是安装了应用程序的OAuth2的一个非常标准的示例。默认情况下,它使用FileDataStore存储用户凭据。在名称为“User”的CredPath中
假设您使用的是完全相同的代码,Windows服务应该会使用它。如果不是,那么我猜这是Windows服务的权限,它需要从该目录读取的权限。
因此,首先要做的是。
1.检查以确保您在Windows服务中使用完全相同的凭据路径和“用户”。
1.检查Windows服务是否可以读取redPath中的文件。
正确配置后,您的用户应该只需要通过WinForms授权您的应用程序,Windows服务应该能够从中读取用户凭据。