我有一个IEnumerable<string>,它是根据方法中的yield语句“流式传输”的。现在,我想将此可枚举转换为Stream以将其用作流式结果。有什么想法可以做到吗?

我最后要做的是从ASP.NET控制器操作中将Stream作为FileStreamResult返回。该结果应作为下载流传输到客户端。

我不想做的是在返回结果之前将IEnumerable的全部内容写入流中。这将消除流媒体概念的整个意义。

最佳答案

您必须创建ActionResult类以实现惰性评估。您已经创建了ContentResultFileStreamResult类的混合体,以实现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);
            }
        }
    }
}

09-05 15:23