【问题标题】:Stream an (SqlFile-)Stream using Nancy使用 Nancy 流式传输 (SqlFile-)Stream
【发布时间】:2015-04-29 19:56:48
【问题描述】:

我想知道如何通过我们的 Nancy-API 将(在我的情况下)SqlFileStream 直接发送到客户端,而无需将流加载到内存中。

到目前为止,我成功地传递了流,但是 Nancy 的 StreamResponse 将源流 (=SqlFileStream) 复制到了输出流,这会导致大量内存增加。我希望它通过它发送流。

我在 WebApi 中完成了这项工作,其中 WebApi 在 Owin 管道中注册。 没有明显的内存增加,当我们谈论相当大的流(> 100MB)时,这很棒。 但如果可能的话,我当然宁愿坚持使用一种 API 应用程序框架。

有什么建议吗?

【问题讨论】:

    标签: memory stream nancy sqlfilestream


    【解决方案1】:

    我想我找到了解决办法。最终做起来并不太难。

    我创建了一个自定义的 Nancy.Response => FlushingStreamResponse。 当这是我们的 GET 的结果时,将流和 mimetype 传递给它会导致立即流式传输到客户端。

    public class FlushingStreamResponse : Response
    {
        public FlushingStreamResponse(Stream sourceStream, string mimeType)
        {
            Contents = (stream) =>
            {
                var buffer = new byte[16 * 1024];
                int read;
                while ((read = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    stream.Write(buffer, 0, read);
                    stream.Flush();
                }
                sourceStream.Dispose();
            };
    
            StatusCode = HttpStatusCode.OK;
            ContentType = mimeType;
        }
    }
    

    【讨论】:

    • 使用简单的Contents = ostream => { sourceStream.CopyTo(ostream); ostream.Flush(); }可以做得更简单(也更惯用)
    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多