我正在编写一个类似于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上运行?
非常感谢任何有用的链接和信息。
答案 0 :(得分:0)
免责声明:这个答案不是假装完整的,在这种情况下谈论的内容很多。但作为一个开始...
您使用的侦听器与它无关。您的代码应该知道RANGE
HTTP标头。提供RANGE
时,请阅读并提供此标题+发送206中指定的文件。否则,请提供整个文件并发送200.
这不是你得到的缓冲区偏移量,而是文件偏移量。
首先设置响应代码和其他元数据(标题),然后写入流作为最后一步。
您可能必须完全改变实际提供文件的方式。例如,在FileStream上调用CopyToAsync()。
它不是Meme
,而是MIME
。