2012-05-31 139 views
1

我使用DropNet为Dropbox OAuth,但我有一个主要问题 - 我无法存储访问令牌密钥和秘密原因没有意义存储它们。存储机制是没有问题的,而不是在这里的一个关键问题 - 问题是这个:访问令牌密钥和秘密不在DropNet中工作

private void dropboxUpload() 
{ 
    DropNetClient _Dclient = new DropNetClient("xxxxxxxxxxxxxxx", "yyyyyyyyyyyyyyy"); 
    _Dclient.UseSandbox = true; 
    if (!dropboxLoggedIn) 
    { 
      _Dclient.GetToken(); 
      string url = _Dclient.BuildAuthorizeUrl(); 
      Process.Start(url); 
      if (MessageBox.Show("Click OK after you have allowed Sizester to create and access a sub-folder called Sizester in a folder called Apps in your Dropbox account.", "Sizester access request", MessageBoxButtons.OKCancel) != System.Windows.Forms.DialogResult.OK) 
      { 
       return; 
      } 
     } 
     try 
     { 
      if (!dropboxLoggedIn) 
      { 
       _Dclient.GetAccessToken(); 
       dropboxAsecret = _Dclient.UserLogin.Secret; 
       dropboxAtoken = _Dclient.UserLogin.Token; 
      } 
      else 
      { 
       _Dclient.UserLogin.Token = dropboxAtoken; 
       _Dclient.UserLogin.Secret = dropboxAsecret; 
      } 
      dropboxLoggedIn = true; 
      //... 
      _Dclient.UploadFile("/", fileE, FileToByteArray(newFilePath)); 
      MessageBox.Show("Successfully uploaded to Dropbox.", "Uploaded to Dropbox"); 
     } 
     catch (Exception dropboxEx) 
     { 
      MessageBox.Show("Error: " + dropboxEx.Message); 
     } 
    } 

这里的问题是 - 第一次上传不错,但第二次就没有 - 虽然dropboxLoggedIn是真,并且访问令牌密钥和机密都存储好,它不会上传文件,但更奇怪的是它不会返回任何错误或异常。 如果我将GetToken从相同的事情发生时移出。我知道我在某个地方做错了事,但我不知道在哪里。 我已经将文件路径等代码的某些部分分条并获取了不相关的文件。 我为Twitter做了同样的事情,但它在那里工作没有问题。 有什么建议吗?

回答

1

好了,问题是在对象的初始化 - 如果你这样做:

DropNetClient _Dclient = new DropNetClient("xxxxxxxxxxxxxxx", "yyyyyyyyyyyyyyy"); 
_Dclient.UseSandbox = true; 
_Dclient.UserLogin.Token = "zzzzzzzzzzzzzzz"; 
_Dclient.UserLogin.Secret = "wwwwwwwwwwwwww"; 

这是行不通的 - 而不是它需要像这样进行初始化:

DropNetClient _Dclient = new DropNetClient("xxxxxxxxxxxxxxx", "yyyyyyyyyyyyyyy","zzzzzzzzzzzzzzz","wwwwwwwwwwwwww"); 
_Dclient.UseSandbox = true; 

我我不知道在哪里找到了一些文档或论坛中的第一个代码示例,但它是错误的。如果您使用它 - 不会发生错误或异常,但Dropbox文件上传或操作将不会完成。如果你使用第二个,那么所有的工作。

+0

呵呵,因为用户登录对象在那一点上是空的。可能会添加一个辅助方法来设置,而不是使用UserLogin属性。 – dkarzon

+1

我是唯一一个看到构造函数具有错误参数顺序的人吗?授权后,当您首次登录'_client.UserLogin'时,它会与Secret和Token值不匹配。所以,调试会给你不正确的顺序:你在秘密看到的实际上是令牌,你在令牌中看到的是秘密的。这将帮助您在构造函数'DropnetClient(consumerKey,consumerSecret,userLogintokenkeyFromDebug,userLoginSecretKeyFromDebug)中传递正确的值' –

1

此链接应该有助于这一问题: http://forums.dropbox.com/topic.php?id=61115&replies=6

基本上你需要初始化你DropNetClient _Dclient实例了上传文件的方法。当您获得访问令牌时,您应该将其保存在会话或配置文件中,并且每次上传文件时都不需要执行此操作。

+0

没关系,我这样做了,但它只适用于应用程序的实例,但如果有人启动应用程序的另一个实例,或者关闭应用程序并再次启动它,它将无法工作(这是一个桌面应用程序) 。我认为只有访问密钥和秘密是重要的,可以保存 - 无论如何,适用于Twitter(应用程序密钥和秘密是相同的每个用户)。 – n1tr0

1

从该行3的外观是搞乱您:if (!dropboxLoggedIn)

因此,如果用户没有在,但是,这应该是真正的第2次尝试你的说法登录你只持续,因此跳过所有的上传代码。

+0

但是,最好的做法是在整个应用程序的全局范围内初始化客户端,并为所有Dropbox函数使用相同的实例。 – dkarzon

+0

它的代码格式错了 - 正如你所看到的 - 如果客户端没有登录,只有gettoken,build authorize url和process start被调用。至于初始化客户端 - 并不那么简单 - 如果应用的另一个实例作为其他进程启动时,它不能共享相同的内存。我没有时间回答我的问题,但我发现有什么不对 - 这是用户设置秘密和令牌。 – n1tr0

相关问题