return 数据从 ServiceStack 渐进 API

return data progressively from ServiceStack API

目前我的应用 returns 数据来自 MemoryStream,问题是 数据大小可能大于 500MB,在 return.

之前占用大量内存

我正在寻找一种方法 return 逐步处理数据。 例如,每 1MB 刷新一次输出。

首先我尝试了IPartialWriter

public class ViewRenderResult : IPartialWriter
{
    public void WritePartialTo(IResponse response)
    {
        response.Write("XXX");

    }

    public bool IsPartialRequest { get { return true; } }
}

response.Write只能调用一次。

然后我发现IStreamWriter

public interface IStreamWriter
{
    void WriteTo(Stream responseStream);
}

我怀疑它在返回之前缓存了所有数据。

谁能解释一下?

之前的回答 shows different response types ServiceStack supports,例如您可以 return 一个 Stream 或直接从您的服务中写入 base.Response.OutputStream

这些 ImageServices 还展示了将二进制响应(如图像)写入响应流的不同方式,例如这是一个使用自定义 IStreamWriter 的示例,它允许您控制如何写入 Response OutputStream:

//Your own Custom Result, writes directly to response stream
public class ImageResult : IDisposable, IStreamWriter, IHasOptions
{
    private readonly Image image;
    private readonly ImageFormat imgFormat;

    public ImageResult(Image image, ImageFormat imgFormat = null)
    {
        this.image = image;
        this.imgFormat = imgFormat ?? ImageFormat.Png;
        this.Options = new Dictionary<string, string> {
            { HttpHeaders.ContentType, this.imgFormat.ToImageMimeType() }
        };
    }

    public void WriteTo(Stream responseStream)
    {
        using (var ms = new MemoryStream())
        {
            image.Save(ms, imgFormat);
            ms.WriteTo(responseStream);
        } 
    }

    public void Dispose()
    {
        this.image.Dispose();
    }

    public IDictionary<string, string> Options { get; set; }
}

您可以 return 在您的服务中使用:

public object Any(ImageAsCustomResult request)
{
    var image = new Bitmap(100, 100);
    using (var g = Graphics.FromImage(image))
    {
        g.Clear(request.Format.ToImageColor());

        return new ImageResult(image, request.Format.ToImageFormat()); 
    }
}