【问题标题】:return data progressively from ServiceStack API从 ServiceStack API 逐步返回数据
【发布时间】:2015-04-16 20:17:30
【问题描述】:

目前我的应用程序通过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);
}

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

谁能解释一下?

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    上一个答案shows different response types ServiceStack supports,例如您可以直接从您的服务中返回Stream 或写信给base.Response.OutputStream。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2016-07-27
      • 2017-09-02
      • 2018-08-05
      • 2019-11-24
      • 1970-01-01
      相关资源
      最近更新 更多