使用响应流的MVC控制器

问题描述 投票:10回答:4

我正在使用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");

我想,我可以建立一个字符串,但由于这些文件可能有几千行长,我认为这似乎效率不高。

谁能给我指出正确的方向? 谢谢,我用的是MVC 3 I。

asp.net-mvc asp.net-mvc-3 actionresult
4个回答
8
投票

昨天我花了一些时间研究了类似的问题,这里有一个正确的方法。

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");
}

15
投票

我发现了一个解决这个问题的方法。 你可以简单的定义动作方法返回一个EmptyResult(),直接写到响应流中。比如说

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

这样做似乎没有任何问题 不知道它是如何 "MVC "的...。



-2
投票

试试这样的东西。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.