我尝试通过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;
这是一个屏幕截图,用于查看已失败的第一个请求的值:
答案 0 :(得分:5)
我们已经看到了关于如何实施this process的足够多的问题,我已经创建了一个快速的小应用程序来展示它是如何工作的。看看下面的要点,看看它与你实际做的比较:
答案 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节
中更新您的问题以显示更多上下文,如果这没有帮助。