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

Dropbox.API SDK not working from Azure server

我正在使用 Dropbox 的 .Net SDK 通过有效的访问令牌将文件上传到我的 Dropbox。从 "localhost".

执行时代码工作正常

但是在 Azure 服务器上部署相同的代码,代码不执行,Dropbox 没有返回 error/response,也没有文件上传。

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

得到了以上信息

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

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

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

更令人困惑的是,这适用于本地主机,但当我们编写测试应用程序并将其部署到 Azure 时却不行!

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

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

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的任何响应,导致timeout/task cacelled异常发生。