2016-01-21 33 views
1

我正在使用Dropbox的.Net SDK通過有效的訪問令牌將文件上傳到我的Dropbox。代碼在從「localhost」執行時工作正常。Dropbox.API SDK無法從Azure服務器工作

但是在Azure服務器上部署相同,代碼不會執行,Dropbox不會返回任何錯誤/響應,也不會上傳文件。

Dropbox確認代碼在所有.NET環境中的行爲都應該是相同的。他們聲稱這可能是因爲Azure服務器防火牆或防病毒安全性可能會阻止對Dropbox的請求。

任何人都可以幫助我使它在Azure環境中工作,或者我如何跟蹤Azure服務器中防火牆阻止的請求?

下面是示例代碼,

public async Task<bool> UploadFile(string accesstoken, string folder, string filename, byte[] file) 
    { 
     try 
     {      
      using (var client = new HttpClient()) 
      { 
       using (var dropbox = new Dropbox.Api.DropboxClient(accesstoken)) 
       { 
        var response = await dropbox.Files.UploadAsync("/" + folder + "/" + filename, WriteMode.Overwrite.Instance, body: new MemoryStream(file)); 
       } 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

我上面從Dropbox blog

+0

你不需要'使用(var client = new HttpClient())'使用塊。 –

+0

HttpClient從IDisposable繼承,因此Dispose()應該在某個時候被調用。在大多數情況下,using語句是實現try,catch,最後確保所有資源都被釋放的最好方式,即使有例外。 –

回答

1

是的。問題出現在路徑的文件夾名稱和空白處。

我們使用的替代方法是使用Core API將文件上傳到Dropbox,而不是使用SDK。

https://www.dropbox.com/developers-v1/core/docs

下面的代碼與核心API行之有效

public async Task<bool> UploadFile(string accesstoken, string foldername, string filename, byte[] file) 
     { 
      try 
      {  
       string url = "https://content.dropboxapi.com/1/files/auto/" + foldername; 

       using (var client = new HttpClient()) 
       { 
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accesstoken); 

        var requestContent = new MultipartFormDataContent(); 
        var fileContent = new StreamContent(new MemoryStream(file)); 
        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
        { 
         Name = "\"file\"", 
         FileName = "\"" + filename + "\"" 
        }; 
        fileContent.Headers.ContentType = 
         MediaTypeHeaderValue.Parse(MimeMapping.GetMimeMapping(filename)); 
        requestContent.Add(fileContent); 

        var response = await client.PostAsync(url, requestContent); 

        return response.IsSuccessStatusCode; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 

然後用SDK的另一個問題是,Task.wait()或Task.Result沒有收到來自Dropbox的長時間任何迴應並讓超時/任務發生cacelled異常。

1

Dropbox的SDK seesm如果你要保存的路徑空白有一個錯誤。這隻會在您動態設置路徑時發生。

在代碼示例中,如果folderfilename有空格,則該呼叫將不起作用。如果您使用的是文字字符串,則空格可以。

不確定SDK內發生了什麼,但是這種行爲可能會在測試項目中出現。

爲了讓它更令人困惑,這適用於localhost,但不適用於我們編寫測試應用程序並將其部署到Azure!