2

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

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

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

有小费吗?

4

1 回答 1

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;
    }
}
于 2015-04-30T07:54:17.893 回答