如何为来自BITS(后台智能传输服务)的Range请求设置正确的HTTP Response对象?

我需要实现一个可以向位发送文件的Web服务(后台智能传输服务)。 语言是ASP.NET(C#)。 我遇到的问题是“范围”的东西。

我的代码当前收到http请求(有效范围出现在0 – 4907的http标头中),随后在响应对象中输出一部分字节数组。

这是我的服务器代码:

_context.Response.Clear(); _context.Response.AddHeader("Content-Range", "bytes " + lower.ToString() + "-" + upper.ToString() + "//" + view.Content.Length.ToString()); _context.Response.AddHeader("Content-Length", upper.ToString()); _context.Response.AddHeader("Accept-Ranges", "bytes"); _context.Response.ContentType = "application/octet-stream"; _context.Response.BinaryWrite(data); _context.Response.End(); 

接下来发生的事情是后续请求根本没有标题中的任何“范围”键……就像它要求整个文件一样! 不用说,位作业错误表明服务器响应无效。

我怀疑这一切都归结为服务器在响应对象中返回的标题…我很确定我在这里遵循协议。

如果有人可以帮忙解决这个问题,我将不胜感激……意思是……我会一直在寻找!

问候

是的,我发现我总共有几个问题。 IIS是一个初始问题,然后是我的长度计算……然后就像你说的那样,范围要求它是自己的。 忽略后者,我对这一部分的最终代码是:

 _context.Response.StatusCode = 206; _context.Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", lower.ToString(), upper.ToString(), view.Content.Length.ToString())); _context.Response.AddHeader("Content-Length", length.ToString()); _context.Response.AddHeader("Accept-Ranges", "bytes"); _context.Response.OutputStream.Write(view.Content.ToArray(), lower, length); 

处理多个请求范围可以在不同的日子处理! 如果BITS以这种方式请求(就像第一次请求后请求整个文件的第二个请求那样),我的代码只返回任何内容……然后BITS在请求中发送一个范围……工作正常从那里。

谢谢你的回复。

您还可以针对已知的静态文件测试运行BITS请求,并使用WireShark嗅探数据包。 这肯定会揭示如何做到这一点。