代码在本地运行,但是当我尝试部署网站并尝试运行它时,它会引发异常:
消息“:”发生错误。“,”ExceptionMessage“:”类未注册“,”ExceptionType“:”System.ComponentModel.Win32Exception“,”StackTrace“:” 在 Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\ r \ n at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(任务 任务)\ r \ n at Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__1.MoveNext() 在 C:\代码\ google.com \ Google处理API-DOTNET客户端\ default_182 \工具\ Google.Apis.Release \ BIN \调试\输出\默认\ SRC \ GoogleApis.Auth.DotNet4 \的OAuth2 \ GoogleWebAuthorizationBroker.cs:线 59
以下是代码:
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = Settings.ClientId,
ClientSecret = Settings.ClientSecret,
},
new[] { DriveService.Scope.Drive },
"user",
CancellationToken.None,
new FileDataStore("MyStore")).Result;
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "AppName",
});
File body = new File();
body.Title = fileName;
body.Description = "Body";
body.MimeType = "text/plain";
String dir = HttpContext.Current.Server.MapPath("~/App_Data");
byte[] byteArray = System.IO.File.ReadAllBytes(fileName);
System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);
FilesResource.InsertMediaUpload request = service.Files.Insert(body, stream, "text/plain");
request.Upload();
非常感谢任何帮助。
更新:
我尝试将代码更改为:
var token = new TokenResponse { RefreshToken = "1/0i6iw4nsecXSVn1_OtYZVo7VCs24jKXdji6gVBrz3TM" };
var credential = new UserCredential(new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = Settings.ClientId,
ClientSecret = Settings.ClientSecret
},
Scopes = new[] { DriveService.Scope.Drive },
DataStore = new FileDataStore("MyStore")
}), "user", token);
它不会抛出异常,但文件不会上传。虽然创建了MyStore文件夹。我错过了什么吗?我也试图实现这里发布的代码http://www.daimto.com/google-oauth2-csharp/,但它也没有用。
答案 0 :(得分:0)
<强>首先强>
'Class not registered'
向我暗示这是dll的一个问题。检查您的机器与服务器是否是GAC中的.dll?不,我不确定他们是否需要加入GAC我还没有测试过我猜测。我几乎记得有一个问题,但它是在不久前。服务器上的.net版本怎么样?又一次猜测。
<强>第二强>
您的代码正在调用FileDataStore
,它会在%appData%
中查找此类内容。注意:文件名末尾的-user
与您发送的"user"
相同。所以你要告诉它用该名称查找该目录中的文件。
%APPDATA%\的MyStore \ Google.Apis.Auth.OAuth2.Responses.TokenResponse用户
您遇到的问题可能是服务器可能无法创建文件的网络服务器,但我不是网络服务器专家您可能想尝试咨询您的网络服务器管理员。
我个人建议您创建自己的IDataStore
实现,我希望将refreshTokens
存储在与用户帐户关联的数据库中。如果您决定这样做,您就可以像refreshToken
这样提供它:
//Now we load our saved refreshToken.
StoredResponse myStoredResponse = new StoredResponse(_RefreshToken);
//现在我们使用StoredResponse传递一个SavedDatastore。
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets { ClientId = "YourClientId", ClientSecret = "YourClientSecret" },
new[] { DriveService.Scope.Drive,
DriveService.Scope.DriveFile },
"user",
CancellationToken.None,
new SavedDataStore(myStoredResponse)).Result; }
注意我是如何使用新的SavedDataStore(myStoredResponse)
而不是new FileDataStore("MyStore")
的。本教程有一个如何创建SavedDataStore
的示例。这段代码有点长,可以在这里发布。
请注意,该教程底部有一个示例项目运行它。是的,我承认它有点混乱,我应该更新该示例项目 的第三强>
我不了解您的更新代码。我认为你不能创建自己的UserCredential
。 UserCredential
在GoogleWebAuthorizationBroker.AuthorizeAsync
获得新AccessToken
之后返回AccessToken
。它可以通过用户请求的访问权限或使用已经拥有的RefreshToken
来获取新的AccessToken
。因此,除非您已经手动获得了自己的UserCredential
或某些内容,否则我将不会看到这将是您可以使用的有效{{1}}。
第四:
我认为你要么受到来自上方的压力,要么你一直在关注这两个问题。退后一步,你的更新让我觉得你绝望和抓住稻草。如果您仍然无法使其正常工作,请免费给我发电子邮件。
如果您确实使用fileDatastore在服务器管理员的帮助下工作,我很想知道以及将来参考。
答案 1 :(得分:0)
&#34;班级未注册&#34;实际上是因为身份验证代码正在尝试启动您的网络浏览器,但由于Chrome在高架模式下运行时出现了错误而失败。
阅读我的google-api-dotnet-client bug report。
中的详细信息解决方法是不以管理员身份运行代码或Visual Studio,或在源代码中进行修改。重新安装Chrome也可能会有所帮助。