目前我的应用程序按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);
}
我怀疑它在返回之前会缓存所有数据。
请有人澄清一下吗?
答案 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());
}
}