2012-05-31 137 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

相關問題