Контроллер MVC, использующий поток ответов - PullRequest
9 голосов
/ 23 августа 2011

Я использую 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, но кажется, что мне нужно создать результат в виде строки, т.е.

вернуть содержимое (myData, "text / csv");

Я мог бы, я полагаю, построить строку, но, поскольку эти файлы могут быть длиной в несколько тысяч строк, мне это кажется неэффективным.

Может ли кто-нибудь указать мне правильное направление? Спасибо.

Ответы [ 4 ]

14 голосов
/ 02 сентября 2011

Я нашел одно возможное решение этой проблемы. Вы можете просто определить метод действия для возврата EmptyResult () и записи непосредственно в поток ответов. Например:

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

Кажется, это работает без проблем. Не уверен, как это MVC ...

8 голосов
/ 05 июня 2015

Я потратил некоторое время на подобную проблему вчера, и вот как это сделать правильно:

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");
}
3 голосов
/ 23 августа 2011

Попробуйте вернуть один из FileResult s: http://msdn.microsoft.com/en-us/library/system.web.mvc.fileresult.aspx

Также см. Этот пример: http://forums.asp.net/t/1491579.aspx/1

0 голосов
/ 02 октября 2013

Попробуйте что-то вроде этого:

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