使用响应流的MVC控制器

Nei*_*ski 9 asp.net-mvc actionresult asp.net-mvc-3

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

我已经查看了ContentResult操作,但似乎我需要将结果创建为字符串,即

return Content(myData,"text/csv");

我想,我可以构建一个字符串,但由于这些文件可能长达数千行,这对我来说似乎效率低下.

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

Nei*_*ski 14

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

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

这似乎没有任何问题.不确定'MVC'是怎样的......


gal*_*ets 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");
}
Run Code Online (Sandbox Code Playgroud)

  • “[AnonymousPipeClientStream] 管道有助于在子进程和父进程之间提供安全可靠的*进程间*通信。” - 似乎有点超出了同进程执行的要求。 (3认同)