Asp.net mvc 使用响应流的MVC控制器

Asp.net mvc 使用响应流的MVC控制器,asp.net-mvc,asp.net-mvc-3,actionresult,Asp.net Mvc,Asp.net Mvc 3,Actionresult,我使用的是MVC 3,我想动态创建一个CSV文件供下载,但我不确定以MVC为导向的正确方法 在传统的ASP.net中,我会编写如下内容: Response.ClearHeaders(); Response.ContentType = "text/csv"; Response.AddHeader("content-disposition", attachment;filename='Test.csv'"); Response.Write("1,2,3"); Response.End(); 我已经

我使用的是MVC 3,我想动态创建一个CSV文件供下载,但我不确定以MVC为导向的正确方法

在传统的ASP.net中,我会编写如下内容:

Response.ClearHeaders();
Response.ContentType = "text/csv";
Response.AddHeader("content-disposition", attachment;filename='Test.csv'");
Response.Write("1,2,3");
Response.End();
我已经查看了
ContentResult
操作,但似乎需要将结果创建为字符串,即

return Content(myData, "text/csv");
我可以,我想,构建一个字符串,但由于这些文件可能有几千行长,这对我来说似乎效率低下


有人能给我指出正确的方向吗?谢谢。

请尝试返回一个
FileResult
s:


另请参见此示例:

我找到了解决此问题的一种可能方法。您可以简单地定义action方法以返回一个EmptyResult()并直接写入响应流。例如:

public ActionResult RobotsText() {
    Response.ContentType = "text/plain";
    Response.Write("User-agent: *\r\nAllow: /");
    return new EmptyResult();
}

这似乎没有任何问题。不确定它的“MVC”是什么…

试试这样:

public ActionResult CreateReport(string report, string writer)
{
    var stream = new MemoryStream();
    var streamWriter = new StreamWriter(stream);

    _generateReport.GenerateReport(report, writer);

    streamWriter.Flush();
    stream.Seek(0, SeekOrigin.Begin);

    return new FileStreamResult(stream, writer.MimeType);
}

昨天,我花了一些时间研究类似的问题,下面是如何正确处理的方法:

public ActionResult CreateReport()
{
    var reportData = MyGetDataFunction();
    var serverPipe = new AnonymousPipeServerStream(PipeDirection.Out);
    Task.Run(() => 
    {
        using (serverPipe)
        {
             MyWriteDataToFile(reportData, serverPipe)
        }
    });

    var clientPipe = new AnonymousPipeClientStream(PipeDirection.In,
             serverPipe.ClientSafePipeHandle);
    return new FileStreamResult(clientPipe, "text/csv");
}

我目前正在使用与文件类似的东西(Encoding.UTF8.GetBytes(sb.ToString()),“text/csv”,fileName),但在提交到视图/响应之前在内存中构建整个输出似乎仍然是一个潜在的问题。请调查File()的其他重载。请看看我贴的链接。有些重载不要求您在内存中生成文件。在将输出数据提交到文件ActionResult之前,生成字节数组(byte[])是否仍在内存中完成输出数据?示例:返回文件(imageData、“image/jpeg”、“fileName.jpg”);不理解您的问题。否-请注意File()的两个重载,它们接受存储在磁盘上的文件的路径。在这些重载中,您自己不需要创建字节[]。请创建一个自定义ActionResult类型,如本文中所述:[[1]:看起来确实是一个副本,它有一个非常好的答案imho()这是一种黑客行为,MVC控制器不应该直接写入响应流。这应该是action result对象的ExecuteSult方法的作业。您确定要使用(serverPipe)吗?它将在FileStreamResult中使用(clientPipe。如果任务运行得很快,会发生什么?@Slava system将管理管道两端之间的数据流,因此这不应该是一个问题。在任务能够消耗所有数据之前,它不会让任务关闭服务器管道。换句话说,任务不会突然退出,它将在写入或关闭流时被保留。试试看,它可以工作。”[AnonymousPipeClientStream]管道有助于在子进程和父进程之间提供安全可靠的进程间通信。“-似乎有点超出了相同进程执行的要求。这完全违背了流的目的。请不要在生产代码中这样做。