我有一个IEnumerable<string>
,这是&#34;流媒体&#34;来自方法的每yield
个语句。现在我想将此枚举转换为Stream
以将其用作流式结果。我有什么想法可以做到这一点吗?
我最终想要做的是从ASP.NET控制器操作返回Stream
为FileStreamResult
。此结果应作为下载流式传输到客户端。
我不想做的是在返回结果之前将IEnumerable
的全部内容写入流。这将消除整个流媒体概念的意义。
答案 0 :(得分:5)
您必须创建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);
}
}
}
}
答案 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;
}