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 似乎有错误。仅当您动态设置路径时才会发生这种情况。
在代码示例中,如果 folder
或 filename
有 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异常发生。
我正在使用 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 似乎有错误。仅当您动态设置路径时才会发生这种情况。
在代码示例中,如果 folder
或 filename
有 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异常发生。