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

C# 400使用BITS协议将文件上载到OneDrive时出错,c#,onedrive,C#,Onedrive,我尝试通过BITS将文件上传到OneDrive 我可以创建一个会话,但是当我想要上传第一个片段时,我在读取响应时收到一个WebException,其中有一个400 HTTP错误错误请求。 例外情况中没有进一步的信息。 我的代码如下: string requestString = String.Format("https://cid-{0}.users.storage.live.com/items/{1}/{2}", userId, folderId, fileName); WebRequest

我尝试通过BITS将文件上传到OneDrive

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

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;
下面是一个屏幕截图,用于查看已失败的第一个请求的值:


github项目中的注释给出了一个强烈的提示,400响应与获取错误的上下文范围和ContentLength头值有关

这需要从发布的信息中进行心理调试,这是非常不一致的。您将片段大小报告为contentLength,但实际上载的片段是content.Count long。很有可能出现不匹配,从而导致400错误

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

webRequest.GetRequestStream().
   Write(content.ToArray(), contentOffset, contentLength);
第二,假设内容只包含片段:

var length = content.Count();
webRequest.Headers.Add("Content-Range", String.Format("bytes {0}-{1}/{2}",
    contentOffset, contentOffset + length - 1, totalContentLength));
webRequest.ContentLength = length;
其中包含Brad建议的范围修正,并记录在第14.16节中


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

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


您提供的链接需要授权…指向GitHub的链接?你是对的,这个例子并不清楚。我不得不将其重写为一个函数,以显示所有代码。我已经更新了我的帖子,所以现在很清楚,它是内容的一部分。还有一个屏幕截图,你可以看到实际的值膨胀,你现在显示了一个名为offset的变量,没有提示它如何与contentOffset关联,这让情况变得更糟:我现在看到的又一个细节,URL不包含每个示例中所示的后续HTTP/1.1。此答案与原始问题的错误相同-范围标头表示正在上载一个以上的字节,因为内容范围处理包含的字节偏移量。{1}的值应该是contentOffset+length-1。我给你一个提示-contentrange头包含包含的偏移量和总长度。当你说0-4194304/1464449024时,你是说你正在从字节0上传到字节4194304,总共4194305字节。在你的例子中,你想从你的末端偏移量计算中减去一个,就这样。非常感谢你。这么愚蠢的错误,简直快把我逼疯了。