C# 使用已定义的OAuth库将文件上载到Dropbox

C# 使用已定义的OAuth库将文件上载到Dropbox,c#,rest,dropbox,devdefined-oauth,C#,Rest,Dropbox,Devdefined Oauth,我试图上传一个文件到Dropbox REST web服务,同时使用Devdefined的OAuth库 这是我正在使用的方法: public static void UploadFile(string filenameIn, string directoryIn, byte[] dataIn) { DropBox.session.Request().Put().ForUrl("https://api-content.dropbox.com/1/files_put/"

我试图上传一个文件到Dropbox REST web服务,同时使用Devdefined的OAuth库

这是我正在使用的方法:

    public static void UploadFile(string filenameIn, string directoryIn, byte[] dataIn)
    {
        DropBox.session.Request().Put().ForUrl("https://api-content.dropbox.com/1/files_put/" + directoryIn + filenameIn)
            .WithQueryParameters(new { param = dataIn });
    }

该方法似乎没有做任何事情,也没有抛出任何异常。输出中也没有错误。我已经尝试使用断点来确认它也在调用代码。

您没有收到错误的原因是因为没有执行请求-要执行请求,您需要获取响应-有很多方法可以做到这一点,但通常最简单的方法就是使用ReadBody()方法获取文本

上传文件的内容不能作为查询参数——根据dropbox REST API,put请求的整个主体应该是文件的内容

基本上,要使这一切正常工作,您需要:

  • 根据API在Url中包含根路径“dropbox”或“sandbox”,我认为您缺少它。如果DropBox应用程序已配置应用程序文件夹,则使用“沙盒”
  • 在使用者上下文中将“UseHeaderForOAuthParameters”设置为true,以确保OAuth签名等作为请求头传递,而不是作为表单参数编码(因为整个正文都是原始数据)
  • 使用“WithRawContent(byte[]contents)”方法将文件的内容添加到请求中
  • 使用PUT请求方法链最末端的“ReadBody()”方法来执行请求
结果将是一个包含JSON的字符串,该字符串应如下所示:

{
  "revision": 5, 
  "rev": "5054d8c6e", 
  "thumb_exists": true, 
  "bytes": 5478,
  "modified": "Thu, 29 Dec 2011 10:42:05 +0000",
  "path": "/img_fa06e557-6736-435c-b539-c1586a589565.png", 
  "is_dir": false, 
  "icon": "page_white_picture",
  "root": "app_folder",
  "mime_type": "image/png",
  "size": "5.3KB"
}
我在github上的DevDefined.OAuth-examples项目中添加了一个示例,演示了如何使用DropBox执行GET和PUT请求:

下面是put请求特别需要的代码:

var consumerContext = new OAuthConsumerContext
{
    SignatureMethod = SignatureMethod.HmacSha1,
    ConsumerKey = "key goes here",
    ConsumerSecret = "secret goes here", 
    UseHeaderForOAuthParameters = true
};

var session = new OAuthSession(consumerContext, "https://api.dropbox.com/1/oauth/request_token",
   "https://www.dropbox.com/1/oauth/authorize",
   "https://api.dropbox.com/1/oauth/access_token");

IToken requestToken = session.GetRequestToken();

string authorisationUrl = session.GetUserAuthorizationUrlForToken(requestToken);

Console.WriteLine("Authorization Url: {0}", authorisationUrl);

// ... Authorize request... and then...

session.ExchangeRequestTokenForAccessToken(requestToken);

string putUrl = "https://api-content.dropbox.com/1/files_put/sandbox/some-image.png";

byte[] contents = File.ReadAllBytes("some-image.png");

IConsumerRequest putRequest = session.Request().Put().ForUrl(putUrl).WithRawContent(contents);

string putInfo = putRequest.ReadBody();

Console.WriteLine("Put response: {0}", putInfo);

希望这会让事情变得更清楚一些,不幸的是,没有文档,仅仅通过查看源代码就可以解决这些问题有点棘手:)

非常感谢,这解决了我的问题!