【问题标题】:Downloading a csv file from Web API does not start无法从 Web API 下载 csv 文件
【发布时间】:2019-06-06 02:38:10
【问题描述】:

我有这个来自不同来源的示例代码,我想先尝试一下,然后再将它应用到我的代码中,这与我得到的示例非常相似。

我的控制器中有以下代码:

[Route("getcsv")]
    [HttpGet]
    public HttpResponseMessage GetCSV()
    {
        var data = new[]{   //Suppose you filter out these data

                           new{ Name="Ram", Email="ram@techbrij.com", Phone="111-222-3333" },
                           new{ Name="Shyam", Email="shyam@techbrij.com", Phone="159-222-1596" },
                           new{ Name="Mohan", Email="mohan@techbrij.com", Phone="456-222-4569" },
                           new{ Name="Sohan", Email="sohan@techbrij.com", Phone="789-456-3333" },
                           new{ Name="Karan", Email="karan@techbrij.com", Phone="111-222-1234" },
                           new{ Name="Brij", Email="brij@techbrij.com", Phone="111-222-3333" }
                  };

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StringContent(WriteTsv(data));
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); //attachment will force download
        result.Content.Headers.ContentDisposition.FileName = "RecordExport.csv";


        return result;
    }

    public string WriteTsv<T>(IEnumerable<T> data)
    {
        StringBuilder output = new StringBuilder();
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
        foreach (PropertyDescriptor prop in props)
        {
            output.Append(prop.DisplayName); // header
            output.Append("\t");
        }
        output.AppendLine();
        foreach (T item in data)
        {
            foreach (PropertyDescriptor prop in props)
            {
                output.Append(prop.Converter.ConvertToString(
                     prop.GetValue(item)));
                output.Append("\t");
            }
            output.AppendLine();
        }
        return output.ToString();
    }

我是通过以下方式调用这个方法的:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>

    <script type="text/javascript">
        function save() {
            window.open('https://localhost:44370/api/values/getcsv', '_blank', '');
        }
    </script>
</head>
<body>
    <a class="btn btn-primary" onclick="save()">Export</a>
</body>
</html>

所有这些都给我以下结果,而不是下载文件:

我不知道我错过了什么。请帮忙!谢谢!

【问题讨论】:

  • 您使用的是什么版本的 web api?如果是Core,那就是问题所在。 HttpResponseMessage 不再是管道的一等公民,并且正在像普通模型一样被序列化。

标签: asp.net-web-api export-to-csv httpresponsemessage


【解决方案1】:

您很可能对您的 Web API 版本使用了错误的语法。

如果使用 Asp.Net Core Web API,则需要将其重构为

[Route("api/[controller]")]
public class ValuesController: Controller {
    //GET api/values/getcsv
    [Route("getcsv")]
    [HttpGet]
    public IActionResult GetCSV() {
        var data = new[]{   //Suppose you filter out these data
           new{ Name="Ram", Email="ram@techbrij.com", Phone="111-222-3333" },
           new{ Name="Shyam", Email="shyam@techbrij.com", Phone="159-222-1596" },
           new{ Name="Mohan", Email="mohan@techbrij.com", Phone="456-222-4569" },
           new{ Name="Sohan", Email="sohan@techbrij.com", Phone="789-456-3333" },
           new{ Name="Karan", Email="karan@techbrij.com", Phone="111-222-1234" },
           new{ Name="Brij", Email="brij@techbrij.com", Phone="111-222-3333" }
        };

        var bytes = System.Text.Encoding.UTF8.GetBytes(WriteTsv(data));
        return File(bytes, "application/octet-stream", "RecordExport.csv");
    }

    //...code omitted for brevity

}

在 Asp.Net Core 中,HttpResponseMessage 不再被视为管道的一等公民,而是像普通模型一样被序列化。

【讨论】:

  • 非常感谢。这解决了我的问题!是的,我正在使用 .NetCore2.2。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2012-11-12
相关资源
最近更新 更多