Search code examples
asp.net-mvcasp.net-mvc-3actionresult

MVC Controller Using Response Stream


I'm using MVC 3 I would like to dynamically create a CSV file for download, but I am unsure as to the correct MVC orientated approach.

In conventional ASP.net, I would have written something like:

Response.ClearHeaders();
Response.ContentType = "text/csv";
Response.AddHeader("content-disposition", attachment;filename='Test.csv'");
Response.Write("1,2,3");
Response.End();

I have looked at the ContentResult action but it appears that I would need to create the result as a string, i.e.

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

I could, I suppose, build a string, but since these files could be several thousand lines long, this seems inefficient to me.

Could someone point me in the right direction? Thanks.


Solution

  • I spent some time on the similar problem yesterday, and here's how to do it right way:

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