我的目标是通过C#中的DropBoxRest API获取文件
当我想获得代币时,我得到了以下错误
中发生类型为"System.AggregateException"的未处理异常mscorlib.dll
我做错了什么?
这是我的代码
var options = new Options
{
ClientId = "", //App key
ClientSecret = "", //App secret
RedirectUri = "https://www.dropbox.com/1/oauth2/authorize"
};
// Initialize a new Client (without an AccessToken)
var client = new Client(options);
// Get the OAuth Request Url
var authRequestUrl = await client.Core.OAuth2.AuthorizeAsync("");
// TODO: Navigate to authRequestUrl using the browser, and retrieve the Authorization Code from the response
var authCode = ""; Which code have to be here ???
// Exchange the Authorization Code with Access/Refresh tokens
var token = await client.Core.OAuth2.TokenAsync(authCode); in this line occured the following error
//An unhandled exception of type 'System.AggregateException' occurred in mscorlib.dll
// Get account info
var accountInfo = await client.Core.Accounts.AccountInfoAsync();
您似乎在使用我的库,所以我会尝试响应。
Dropbox API使用OAuth 2.0流,这意味着您需要将用户重定向到Dropbox页面进行身份验证,并批准您的应用程序访问他们的数据。
调用AuthorizeAsync
(注意"code"
参数)后:
var authRequestUrl = await client.Core.OAuth2.AuthorizeAsync("code");
您将收到一个URL,可以将用户重定向到该URL。该URL将在Dropbox中打开一个页面以进行身份验证和批准。之后,用户将被重定向回您在选项中的RedirectUri
中提供的URL。重定向将在URL的查询字符串中包含代码。
这意味着你应该有一个服务器,它将监听你的RedirectUri。例如:
var options = new Options
{
ClientId = "", //App key
ClientSecret = "", //App secret
RedirectUri = "https://www.myserver.com/Dropbox/SetCode"
};
如果你使用MVC,你可能会在控制器中有一个动作,如下所示:
public class DropboxController : Controller
{
public ActionResult SetCode(string code, string error) {}
}
一旦检索到code
,就可以调用TokenAsync()
:
var token = await client.Core.OAuth2.TokenAsync(authCode);
您的代码基于我的库中的示例,该示例要求您手动复制authRequestUrl
,在浏览器中打开它,然后手动检索代码。
注意:有几种方法可以在没有服务器的情况下工作,但这些方法超出了库本身的范围。如果有足够的需求,我可能会考虑把它们包括在内。
首先,当您捕获异常时,您可以获得有关此错误的更多详细信息:
try
{
var token = await client.Core.OAuth2.TokenAsync(authCode);
}
catch (AggregateException aex)
{
// set a breakpoint on the opening curly brace and check the
// variable "aex".
}
第二件事是,您需要一组秘密来执行OAuth。正如这里提到的,你需要一些东西来识别你自己。您的应用程序对抗OAuth提供商。为此,您需要提供OAuth提供程序提供给您的某种密钥。
在Dropbox,您需要通过控制台配置所有内容。
编辑
你必须在DropBox AppConsole上生成一个访问令牌,你可以直接将其传递给客户端选项:
var options = new Options
{
ClientId = "{see console}", //App key
ClientSecret = "{see console}", //App secret
AccessToken = "{see console}",
RedirectUri = "{see console}"
};
var client = new Client(options);
在这种情况下,默认情况下不需要获取令牌。
由于投了反对票,我把它调试好了。我可以得到异常详细信息,说明如下:
DropboxRestAPI.Models.Exceptions.ServiceErrorException未处理消息:mscorlib.dll中出现"DropboxRestAPI.Models.Exceptions.ServiceErrorException"类型的未处理异常附加信息:invalid_grant
DropBox的JavaScript-documentation声明这可能指示错误的API。