2

メモリにストリームをロードせずに、Nancy-API を介して (私の場合) SqlFileStream をクライアントに直接送信する方法を考えていました。

ここまではストリームの受け渡しに成功しましたが、Nancy の StreamResponse は sourcestream (=SqlFileStream) を outputstream にコピーするため、メモリが大幅に増加します。ストリームを送信したい場所。

WebApi が Owin パイプラインに登録されている WebApi でこの作業を行いました。メモリの増加は目立ちません。これは、かなり大きなストリーム (>100MB) について話している場合に最適です。しかしもちろん、できれば 1 つの API アプリケーション フレームワークに固執したいと思います。

任意のヒント?

4

1 に答える 1

1

私は解決策を見つけたと思います。結局のところ、それを行うのはそれほど難しくありませんでした。

カスタム Nancy.Response => FlushingStreamResponse を作成しました。ストリームと MIME タイプを渡すと、これが GET の結果である場合、クライアントにすぐにストリーミングされます。

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 に答える