[英]C# HttpListener Partial Content
我正在编写类似于HFS
的应用程序,这是一个具有HTML/CSS/JS
自定义主题的HTTP File Server
,并且我希望能够分多个部分提供文件服务,因为大多数下载管理器都通过多个连接到服务器连接并下载文件为8
件,该功能最终提高了下载速度,并使下载具有恢复和暂停的功能。
据我所知, HTTP's Partial Content
使这一切成为可能,我环顾了整个网络,但是找不到任何在我使用HttpListener
来提供网页和文件的代码中实现该代码的好例子。
我见过某处有人建议改用TcpListener
但由于我的整个应用程序都在HttpListener
,因此还没有真正找到任何使用TcpListener
切换部分内容的好例子。
Web服务器是多线程的,通过不同的连接同时处理许多请求没有任何问题。 但是,每当我使用IDM
下载大文件时,它都会通过单个连接提供内容,而IDM显示服务器无法提供"206"
( HTTP Partial Content
)
这是我当前用于提供文件的代码:
context.Response.ContentType = GetMeme(filename);
Stream input = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
context.Response.ContentLength64 = input.Length;
byte[] buffer = new byte[1024 * 16];
int nbytes;
while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0)
context.Response.OutputStream.Write(buffer, 0, nbytes);
input.Close();
context.Response.StatusCode = (int)HttpStatusCode.OK;
context.Response.OutputStream.Flush();
context.Response.OutputStream.Close();
我试图从HTTP头获取缓冲区偏移量,但由于偏移量,它无法关闭流,并说Cannot close stream until all bytes are written.
还有更好的选择吗? 甚至HttpListener都可以正确处理HTTP:206吗? TcpListener上的部分内容如何工作?
任何有用的链接和信息将不胜感激。
免责声明:这个答案并不假装是完整的,在这种情况下,有太多事情要讨论。 但是作为开始...
您使用的侦听器与此无关。 您的代码应注意RANGE
HTTP标头。 提供RANGE
,按照此标头中的指定读取并提供文件+发送206。否则,提供整个文件并发送200。
它不是您获得的缓冲区偏移量,而是文件偏移量。
首先设置响应代码和其他元数据(标题),并作为最后一步写入流。
而且,您可能必须完全改变实际提供文件的方式。 例如,在您拥有的FileStream上调用CopyToAsync()。
它不是Meme
,而是MIME
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.