从ServiceStack API逐步返回数据

时间:2015-02-16 10:34:24

标签: servicestack

目前我的应用程序按MemoryStream返回数据,问题是 数据大小可能大于500MB,并且在返回之前会占用大量内存。

我正在寻找一种逐步返回数据的方法。 例如,每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);
}

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

请有人澄清一下吗?

1 个答案:

答案 0 :(得分:2)

之前的回答shows different response types ServiceStack supports,例如您可以直接从服务中返回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; }
}

您可以通过以下方式返回服务:

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()); 
    }
}