使用BITS协议将文件上载到OneDrive时出现400错误

时间:2015-01-14 14:14:56

标签: c# onedrive

我尝试通过BITS(OneDrive Large File Upload API)将文件上传到OneDrive。

我可以创建一个会话,但是当我想上传第一个片段时,我在读取响应时收到一个带有400 HTTP错误(错误请求)的WebException。 例外中没有进一步的信息。 我的代码是这样的:

string requestString = String.Format("https://cid-{0}.users.storage.live.com/items/{1}/{2}", userId, folderId, fileName);

WebRequest webRequest = WebRequest.Create(requestString);
webRequest.Headers.Add("X-Http-Method-Override", "BITS_POST");
webRequest.Headers.Add("Authorization", "Bearer " + accessToken);
webRequest.Headers.Add("BITS-Packet-Type", "Fragment");
webRequest.Headers.Add("BITS-Session-Id", sessionId);

webRequest.Headers.Add("Content-Range", String.Format("bytes {0}-{1}/{2}", contentOffset, (contentFragment.Count() + contentOffset), totalContentLength));

webRequest.ContentLength = contentFragment.Count();

webRequest.Method = "POST";


webRequest.GetRequestStream().Write(contentFragment.ToArray(), 0, contentFragment.Count());

WebResponse webResponse = webRequest.GetResponse() as WebResponse;

这是一个屏幕截图,用于查看已失败的第一个请求的值:

enter image description here

2 个答案:

答案 0 :(得分:5)

我们已经看到了关于如何实施this process的足够多的问题,我已经创建了一个快速的小应用程序来展示它是如何工作的。看看下面的要点,看看它与你实际做的比较:

https://gist.github.com/ificator/3460d7b9d0bff74eb0ff

答案 1 :(得分:3)

github项目中的注释强烈暗示400响应与使Context-Range和ContentLength标头值错误相关联。

这需要从发布的信息进行心灵调试,这是非常不一致的。您将片段大小报告为contentLength,但实际上传的片段长度为content.Count()。不匹配的好机会,因此400错误。

因此,假设content包含所有可上传的数据,我可以提出第一个建议:

webRequest.GetRequestStream().
   Write(content.ToArray(), contentOffset, contentLength);

第二个,假设content仅包含片段:

var length = content.Count();
webRequest.Headers.Add("Content-Range", String.Format("bytes {0}-{1}/{2}",
    contentOffset, contentOffset + length - 1, totalContentLength));
webRequest.ContentLength = length;

其中包含Brad建议的范围修正,并记录在RFC-2616,第14.16节

更新您的问题以显示更多上下文,如果这没有帮助。