我有一个IEnumerable<string>
,它是根据方法中的yield
语句“流式传输”的。现在,我想将此可枚举转换为Stream
以将其用作流式结果。有什么想法可以做到吗?
我最后要做的是从ASP.NET控制器操作中将Stream
作为FileStreamResult
返回。该结果应作为下载流传输到客户端。
我不想做的是在返回结果之前将IEnumerable
的全部内容写入流中。这将消除流媒体概念的整个意义。
最佳答案
您必须创建ActionResult类以实现惰性评估。您已经创建了ContentResult
和FileStreamResult
类的混合体,以实现FileStreamResult之类的行为,并具有设置结果编码的能力。良好的起点是FileResult
抽象类:
public class EnumerableStreamResult : FileResult
{
public IEnumerable<string> Enumerable
{
get;
private set;
}
public Encoding ContentEncoding
{
get;
set;
}
public EnumerableStreamResult(IEnumerable<string> enumerable, string contentType)
: base(contentType)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}
this.Enumerable = enumerable;
}
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
if (this.ContentEncoding != null)
{
response.ContentEncoding = this.ContentEncoding;
}
if (this.Enumerable != null)
{
foreach (var item in Enumerable)
{
//do your stuff here
response.Write(item);
}
}
}
}