如何刷新HttpListener响应流?

6

HttpListener提供了响应流,但调用flush没有任何作用(从源代码中可以看出,因为它实际上什么都没做)。深入研究HTTP API后发现这是HttpListener本身的限制。

有人知道如何刷新HttpListener的响应流吗(可能需要使用反射或额外的P/Invokes)?

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

2个回答

2

仅当Transfer-Encoding设置为Chuncked时,Flush才适用于System.Net命名空间中的大多数情况,否则整个请求将被返回,Flush实际上没有任何作用。这是我在使用HttpWebResponse时所经历的。


问题不在于为什么它不能工作...而是想象一下http流式传输,其中尽快发送某些内容非常重要。分块数据在这里根本不是一个选项。HttpListener实际上会在您完成请求之前发送一些内容,但它使用的缓冲区相当大且无法配置。 - Mash
顺便说一下,当你要求时,ASP.NET可以正常刷新... ASP.NET需要一些技巧才能在完整的POST主体被检索之前获取InputStream内容,但OutputStream可以正常工作。 - Mash
1
HTTP并不是真正的流媒体协议。它旨在通过互联网传输文本,因此被称为超文本传输协议。如果您想要流媒体,我建议使用套接字。或者使用更好的流媒体内容分成足够小的数据包来进行控制。 - Nick Berardi
1
谢谢你,尼克。但你会惊讶地发现,今天大多数的流媒体流量都使用HTTP。HTTP只是二进制TCP流前面的HTTP头...唯一的问题是如何使用管理工具来创建服务器。HttpListener是基于TCP的服务器中最快的托管选项,但微软忘记在其中添加手动刷新功能。 - Mash
1
你是否有使用HttpListener的特殊原因?使用URL重写和代理不是可以达到同样的效果吗?这里有一个关于Managed Fusion URL Rewriter的链接,它曾在2008年PDC上展示过。http://www.coderjournal.com/2009/04/managed-fusion-url-rewriter-was-featured-at-pdc-2008/ - Nick Berardi

0

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

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


编写单独的TCP服务器?最好使用TcpListener编写所有内容(比.NET套接字更快),但比HttpListener慢得多。我会检查dispose的来源,但在我看来,这不是正确的方法。在http.sys中定义了数据包本身是否刷新。 - Mash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接