无法将文件上传到Google云端硬盘

时间:2014-06-12 07:31:53

标签: c# asp.net-mvc google-drive-api

代码在本地运行,但是当我尝试部署网站并尝试运行它时,它会引发异常:

  

消息“:”发生错误。“,”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/,但它也没有用。

2 个答案:

答案 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的示例。这段代码有点长,可以在这里发布。

请注意,该教程底部有一个示例项目运行它。是的,我承认它有点混乱,我应该更新该示例项目 的第三

我不了解您的更新代码。我认为你不能创建自己的UserCredentialUserCredentialGoogleWebAuthorizationBroker.AuthorizeAsync获得新AccessToken之后返回AccessToken。它可以通过用户请求的访问权限或使用已经拥有的RefreshToken来获取新的AccessToken。因此,除非您已经手动获得了自己的UserCredential或某些内容,否则我将不会看到这将是您可以使用的有效{{1}}。

第四:

我认为你要么受到来自上方的压力,要么你一直在关注这两个问题。退后一步,你的更新让我觉得你绝望和抓住稻草。如果您仍然无法使其正常工作,请免费给我发电子邮件。

如果您确实使用fileDatastore在服务器管理员的帮助下工作,我很想知道以及将来参考。

答案 1 :(得分:0)

&#34;班级未注册&#34;实际上是因为身份验证代码正在尝试启动您的网络浏览器,但由于Chrome在高架模式下运行时出现了错误而失败。

阅读我的google-api-dotnet-client bug report

中的详细信息

解决方法是不以管理员身份运行代码或Visual Studio,或在源代码中进行修改。重新安装Chrome也可能会有所帮助。