C#HttpListener部分内容

时间:2017-10-24 16:03:11

标签: c# http tcplistener httplistener

我正在编写一个类似于HFS的应用程序HTTP File Server,其HTML/CSS/JS中包含自定义主题,我希望能够以多个部分提供我的文件,因为大多数下载管理器通过多个连接连接到服务器并将文件下载为8件,并且该功能最终提高了下载速度,并使下载具有恢复和暂停的能力。

据我所知,HTTP's Partial Content使这成为可能,我已经浏览了网络,但无法找到任何关于如何在我的代码中实现它的好例子{i HttpListener 1}}提供网页和文件。

我已经看到有人建议使用TcpListener而不是因为我的整个应用都适用于HttpListener,并且找不到任何使用{提供部分内容的好例子{1}}切换。

网络服务器是多线程的,并且在通过不同连接同时处理许多请求时没有任何问题。 但每当我下载一个包含TcpListener的大文件时,它只通过一个连接提供内容,而IDM显示服务器无法提供服务IDM"206"

以下是我目前用于提供文件的代码:

HTTP Partial Content

我试图从HTTP头获取缓冲区偏移但由于偏移而无法关闭流并且说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();

还有更好的选择吗? 甚至HttpListener可以正确处理HTTP:206吗? 部分内容如何在TcpListener上运行?

非常感谢任何有用的链接和信息。

1 个答案:

答案 0 :(得分:0)

免责声明:这个答案不是假装完整的,在这种情况下谈论的内容很多。但作为一个开始...

您使用的侦听器与它无关。您的代码应该知道RANGE HTTP标头。提供RANGE时,请阅读并提供此标题+发送206中指定的文件。否则,请提供整个文件并发送200.

这不是你得到的缓冲区偏移量,而是文件偏移量。

首先设置响应代码和其他元数据(标题),然后写入流作为最后一步。

您可能必须完全改变实际提供文件的方式。例如,在FileStream上调用CopyToAsync()。

它不是Meme,而是MIME