【问题标题】:HttpListener writing data to response output streamHttpListener 将数据写入响应输出流
【发布时间】:2013-08-02 08:04:36
【问题描述】:

我有基于 HttpListener 的小型本地 Web 服务器。服务器向本地客户端应用程序提供文件解包并将文件写入

response.OutputStream;

但有时文件(视频)很大,我认为始终将所有文件字节复制到输出流(内存)不是一个好主意。我想将服务文件流连接到响应输出流,如下所示:

response.OutputStream = myFileStream;

但是 -ok- response.OutputStream 是只读的,所以我只能写入字节 - 有没有办法进行某种部分写入(流式传输)?

问候。

【问题讨论】:

  • 所以...您正在尝试创建流连接,下一步是将文件划分为单独的包并同时发送它们并在客户端重建它们...为什么会赢你不就那样做吗?
  • 提供的视频文件显示在 Web 浏览器 (gecko fx) 和视频 (mp4) 请求到来时(html5

标签: c# streaming httplistener


【解决方案1】:

您需要创建一个线程并将数据流式传输以进行响应。 使用这样的东西:

在你的主线程中:

while (Listening)
{
    // wait for next incoming request
    var result = listener.BeginGetContext(ListenerCallback, listener);
    result.AsyncWaitHandle.WaitOne();
}

你班上的某个地方:

public static void ListenerCallback(IAsyncResult result)
{
    var listenerClosure = (HttpListener)result.AsyncState;
    var contextClosure = listenerClosure.EndGetContext(result);

    // do not process request on the dispatcher thread, schedule it on ThreadPool
    // otherwise you will prevent other incoming requests from being dispatched
    ThreadPool.QueueUserWorkItem(
        ctx =>
        {
            var response = (HttpListenerResponse)ctx;

            using (var stream = ... )
            {
                stream.CopyTo(response.ResponseStream);
            }

            response.Close();
        }, contextClosure.Response);
}

【讨论】:

  • 这是一个类似的帖子(有更多上下文):stackoverflow.com/questions/13385633/…
  • 我认为 stream.CopyTo(response.ResponseStream) 将所有文件字节复制到输出流,这是我想要避免的。
  • UGEEN,如果将 .AllowWriteStreamBuffering 属性设置为 false,它将不会在本地缓存任何内容。当客户端停止接收时,它将停止发送。
  • 好吧,通常如果您不想从服务器发送所有内容,您需要让客户端告诉您它到底需要什么。对于视频,可能有特殊的约定 - 但对于常规数据,客户端通常会附加“content-range”标头,您可以在其中接收客户端想要响应此特定请求的字节范围。看这里:stackoverflow.com/questions/716680/…
  • 另外,请记住,即使 CopyTo 会发送所有内容,它也不会首先尝试将该数据缓存到服务器内存中。 HttpListener 的响应实现也不会缓存发送的数据。
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2013-12-16
  • 2013-12-14
  • 2011-08-15
  • 2012-02-09
  • 2010-10-22
相关资源
最近更新 更多