我正在编写一个类似于 HFS
的应用程序,它是一个 HTTP 文件服务器
,在 HTML/CSS/JS
中具有自定义主题,我我希望能够在多个部分提供我的文件,因为大多数下载管理器通过多个连接连接到服务器并将文件下载为 8
个部分,该功能最终提高了下载速度,并且它使下载具有恢复和暂停的能力。
据我所知,HTTP 的部分内容
使这成为可能,我环顾了整个网络,但找不到任何好的示例来说明如何在我使用的代码中实现它 HttpListener
为网页和文件提供服务。
我在某处看到有人建议改用 TcpListener
,但由于我的整个应用程序都在 HttpListener
上运行,而且还没有真正找到任何提供部分内容的好例子用TcpListener
来切换。
网络服务器是多线程的,同时通过不同的连接处理许多请求没有任何问题。
但是每当我使用 IDM
下载一个大文件时,它只是通过单个连接提供内容,IDM 显示服务器无法提供 “206”
(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();
我试图从 HTTP 头获取缓冲区偏移量,但由于偏移量而无法关闭流,并显示 在写入所有字节之前无法关闭流。
有没有更好的选择? HttpListener 甚至可以正确处理 HTTP:206 吗? 部分内容如何在 TcpListener 上工作?
任何有用的链接和信息将不胜感激。
最佳答案
免责声明:这个答案并不是假装完整,只是在这种情况下要谈的事情太多了。但作为开始...
您使用的监听器与其无关。您的代码应该知道 RANGE
HTTP header 。当提供 RANGE
时,读取并提供此 header 中指定的文件 + 发送 206。否则,提供整个文件并发送 200。
得到的不是缓冲区偏移量,而是文件偏移量。
首先设置响应代码和其他元数据( header ),最后一步写入流。
而且您可能必须完全改变实际提供文件的方式。例如,在您拥有的 FileStream 上调用 CopyToAsync()。
而且它不是 Meme
,它是 MIME
。
关于C# HttpListener 部分内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46915151/