Dropbox.API SDK无法在Azure服务器上运行

时间:2016-01-21 11:56:58

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

我正在使用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

获得了上述内容

2 个答案:

答案 0 :(得分:1)

如果要保存的路径中有空格,DropBox SDK会发生错误。只有在动态设置路径时才会发生这种情况。

在代码示例中,如果folderfilename有空格,则通话无效。如果您使用的是文字字符串,那么空格就可以了。

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

为了让它更加混乱,这适用于localhost,但不适用于我们编写测试应用程序并将其部署到Azure!

答案 1 :(得分:1)

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

我们使用的替代方法是使用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的任何响应,并且发生超时/任务cacelled异常。