C# HttpListener 部分内容

标签 c# http tcplistener httplistener

我正在编写一个类似于 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/

相关文章:

http - WGET 401 未经授权

c# - TcpListener:如何检测客户端断开连接?

c# - 如何在不使用表上下文的情况下忽略表存储资源未找到异常?

c# - 如何处理 "Unset"事件

c# - 访问参数的属性时使用 ArgumentNullException

javascript - 因此,AngularJS : No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' 不允许访问

c# - 如何生成用户定义数量的素数?

angular - 从浏览器获取 'blocked:other' 错误状态 - 在 Angular 应用程序中,我进行了一个 rest api 调用以从服务器获取信息

c# - 如何使端口安全

c# - 从运行时创建的对象订阅事件