【问题标题】:Dropbox.API SDK not working from Azure serverDropbox.API SDK 无法在 Azure 服务器上运行
【发布时间】:2016-04-27 15:57:31
【问题描述】:

我正在使用 Dropbox 的 .Net SDK 使用有效的访问令牌将文件上传到我的 Dropbox。从“localhost”执行时,代码运行良好。

但是在 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得到以上信息

【问题讨论】:

  • 你不需要using (var client = new HttpClient()) using 块。
  • HttpClient 继承自 IDisposable,因此,应在某个时候调用 Dispose()。在大多数情况下,using 语句是最好的方法,因为它实现了 try,catch,finally 以确保所有资源都被释放,即使出现异常。

标签: asp.net azure oauth-2.0 firewall dropbox-api


【解决方案1】:

如果您保存到的路径中有空格,DropBox SDK 似乎有错误。仅当您动态设置路径时才会发生这种情况。

在代码示例中,如果folderfilename 有空格,则调用将不起作用。如果您使用的是文字字符串,则可以使用空格。

不确定 SDK 内部发生了什么,但在测试项目中可以显示这种行为。

更令人困惑的是,这适用于 localhost,但不适用于我们编写测试应用并将其部署到 Azure!

【讨论】:

    【解决方案2】:

    是的。问题在于路径的文件夹名称及其空格。

    我们使用的替代方法是使用 Core API 而不是 SDK 将文件上传到 Dropbox。

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

    以下代码适用于 Core 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 的任何响应,并让超时/任务取消异常发生。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2017-10-30
      • 2014-05-04
      • 2010-12-09
      • 2016-06-27
      • 1970-01-01
      • 2015-01-21
      • 2014-09-08
      相关资源
      最近更新 更多