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());
}
}
目前我的应用 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());
}
}