IEnumerable <string>到Stream for FileStreamResult </string>

时间:2014-04-03 07:13:04

标签: c# .net asp.net-mvc stream ienumerable

我有一个IEnumerable<string>,这是&#34;流媒体&#34;来自方法的每yield个语句。现在我想将此枚举转换为Stream以将其用作流式结果。我有什么想法可以做到这一点吗?

我最终想要做的是从ASP.NET控制器操作返回StreamFileStreamResult。此结果应作为下载流式传输到客户端。

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

2 个答案:

答案 0 :(得分:5)

您必须创建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);
            }
        }
    }
}

答案 1 :(得分:-1)

我认为你可以在这里首先将你的字符串转换为字节数组,然后使用内存stram

string sourceFile = System.Web.HttpContext.Current.Server.MapPath(Path.Combine("/", "yourAddress"));
byte[] byteArray = System.IO.File.ReadAllBytes(sourceFile);

MemoryStream mem;
        using (mem = new MemoryStream())
        {
            mem.Write(byteArray, 0, (int)byteArray.Length);
            return mem;
        }