Поток (SqlFile-) Stream с использованием Нэнси

Мне было интересно, как отправить (в моем случае) SqlFileStream напрямую клиенту через наш Nancy-API без загрузки потока в память.

До сих пор мне удалось передать поток, но StreamResponse Нэнси копирует исходный поток (= SqlFileStream) в выходной поток, что приводит к значительному увеличению памяти. Где я просто хотел бы отправить поток.

Я сделал эту работу в WebApi, где WebApi был зарегистрирован в конвейере Owin. Прирост памяти не заметен, и это здорово, когда мы говорим о довольно больших потоках (> 100 МБ). Но, конечно, я бы предпочел придерживаться одной API-приложения, если это возможно.

Какие-нибудь советы?


person Guillaume Schuermans    schedule 29.04.2015    source источник


Ответы (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;
    }
}
person Guillaume Schuermans    schedule 30.04.2015
comment
Это можно сделать немного проще (и более идиоматично), используя простой Contents = ostream => { sourceStream.CopyTo(ostream); ostream.Flush(); } - person kostix; 24.07.2015