繁体   English   中英

C#HttpListener部分内容

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM