【问题标题】:How to flush HttpListener response stream?如何刷新 HttpListener 响应流?
【发布时间】:2010-10-22 02:34:24
【问题描述】:

HttpListener 为您提供响应流,但调用 flush 没有任何意义(从来源可以看出,因为它实际上什么也没做)。深入研究 HTTP API 表明这是 HttpListener 本身的限制。

有人确切知道如何刷新 HttpListener 的响应流(可能带有反射或额外的 P/Invokes)?

更新:如果您没有刷新选项或定义缓冲区大小的能力,则无法 http 流式传输任何内容。

【问题讨论】:

    标签: c# .net http flush httplistener


    【解决方案1】:

    当 Transfer-Encoding 设置为 Chuncked 时,Flush 仅在大多数 System.Net 命名空间中有效,否则将返回整个请求并且 Flush 真的什么都不做。至少这是我在使用 HttpWebResponse 时所经历的。

    【讨论】:

    • 问题不是为什么它不工作......但想象一下http流媒体,尽快发送一些东西很重要。分块数据在这里根本不是一种选择。 HttpListener 实际上在您完成请求之前发送了一些东西,但它使用了相当大的不可配置缓冲区。
    • 顺便说一句,当您询问时,ASP.NET 可以正常刷新... ASP.NET 需要一些技巧才能在检索到完整的 POST 正文之前获取 InputStream 内容,但 OutputStream 可以正常工作。跨度>
    • HTTP 并不是真正的流协议。它旨在通过互联网传输文本,因此称为超文本传输​​协议。如果您想要流式传输,我建议您使用套接字。或者更适合以足够小的数据包传输内容以供您控制。
    • 谢谢你,尼克,但你会惊讶于今天的大多数流媒体流量都使用 HTTP。 HTTP 只不过是二进制 TCP 流前面的 HTTP 标头……唯一的问题是创建服务器的托管工具。 HttpListener 是基于 TCP 的服务器的最快托管选项,但 MS 忘记在其中添加手动刷新。
    • 有什么理由让您与 HttpListener 相关联吗?带有代理的 URL 重写器不会完成同样的事情吗? coderjournal.com/2009/04/…
    【解决方案2】:

    我还没有尝试过,但是为流式响应编写一个单独的 TCP 服务器怎么样?然后将来自 HttpListener 的请求转发到“内部”tcp 服务器。使用此重定向,您可以根据需要将数据流回。

    至于冲洗它,我看到的唯一方法是模拟处置,而不是实际处置。如果你可以侵入 HttpResponseStream 对象,告诉它处理,取消设置 m_Closed 标志等,你也许可以刷新流数据。

    【讨论】:

    • 编写单独的 TCP 服务器?最好只用 TcpListener(比 .NET Sockets 快)编写所有内容,但它比 HttpListener 慢得多。我会检查处置来源,但恕我直言,这不是正确的方法。数据包本身定义的http.sys中是否刷新。
    猜你喜欢
    • 2012-02-09
    • 2011-07-11
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多