C# FileHelper读取到流并使用web api下载

C# FileHelper读取到流并使用web api下载,c#,asp.net-web-api,filehelpers,C#,Asp.net Web Api,Filehelpers,我有一个对象列表,我想通过Web Api下载为csv文件。 然而,当我用Swagger测试时,我没有得到csv下载。 我做错了什么?DailyReportContent包含2个对象 这是我目前的代码: public IActionResult GetDailyReport(DateTime invoiceDate) { var dailyReportContent = new List<DailyReportModel>()..... // create csv f

我有一个对象列表,我想通过Web Api下载为csv文件。 然而,当我用Swagger测试时,我没有得到csv下载。 我做错了什么?DailyReportContent包含2个对象

这是我目前的代码:

public IActionResult GetDailyReport(DateTime invoiceDate)
{
    var dailyReportContent = new List<DailyReportModel>().....

    // create csv file
    var engine = new FileHelperEngine<DailyReportModel>
    {
        HeaderText = "headers.."
    };

    using (var stream = new MemoryStream())
    using (var streamWriter = new StreamWriter(stream))
    {
        engine.WriteStream(streamWriter, dailyReportContent);

        var result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "DailyReports.csv" };

        return Ok(result);
    }
}
编辑:即使我添加了以下内容:

 stream.Flush();
 streamWriter.Flush();

 var reader = new StreamReader(stream);
 var readResult = reader.ReadToEnd();
readResult为空。所以我想写流的时候出了点问题?

我想你需要

return result;
返回“Ok()”将返回包含该对象的响应消息。
您已经创建了响应消息并指定了所有内容。
因此,我认为您正在返回一个OK响应,其中包含另一条OK响应消息。

如下所示:

var csvContent = LoadcsvContent();

var engine = new FileHelperEngine<DailyReportModel>
{
    HeaderText = "......."
};

var stream = new MemoryStream();
TextWriter streamWriter = new StreamWriter(stream);
engine.WriteStream(streamWriter, csvContent);

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

return File(await stream, "text/csv", $"Report_{invoiceDate:yyyyMMdd}.csv");
var csvContent=LoadcsvContent();
变量引擎=新文件帮助引擎
{
HeaderText=“……”
};
var stream=newmemoryStream();
TextWriter streamWriter=新streamWriter(流);
engine.WriteStream(streamWriter,csvContent);
streamWriter.Flush();
stream.Seek(0,SeekOrigin.Begin);
返回文件(等待流,“text/csv”,$“Report_uIceDate:yyyyymmdd}.csv”);
现在很有魅力。大摇大摆输出:


在ASP.NetCore中,我们有
返回文件(ret,“应用程序/八位字节流”,文件名)


返回一个具有所需类型的文件,在我的.msi包中,我使用了
“application/octet stream”
,您可以在控制器级别将返回类型指定为.CSV,或者在
格式化程序的
WebApiConfig
类的全局级别将返回类型指定为.CSV。给我完全相同的响应,没有下载csv文件:(如果使用浏览器调用端点,会怎么样?是否下载了文件?
var csvContent = LoadcsvContent();

var engine = new FileHelperEngine<DailyReportModel>
{
    HeaderText = "......."
};

var stream = new MemoryStream();
TextWriter streamWriter = new StreamWriter(stream);
engine.WriteStream(streamWriter, csvContent);

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

return File(await stream, "text/csv", $"Report_{invoiceDate:yyyyMMdd}.csv");