写入流的asp.net Web API csv帮助程序不起作用

问题描述 投票:0回答:2

我最初的要求是让用户从对象列表中下载一个文件,我找到了这个解决方案https://stackoverflow.com/a/49207997/11178128

但问题是涉及到这条线

bin = stream.ToArray();

没有写入流的流。所以bin作为一个空数组。可能是什么问题呢?

另外,我正在通过Windows服务提供我的Web API。由于某种原因,System.Web.HttpContext.Current.Response给了我null。知道为什么会这样吗?提前致谢。

这是我到目前为止的代码,

List<Device> devices;

    using (StreamReader r = new StreamReader(String.Format(@"{0}\deviceList.json", savefilePath)))
    {
      string json = r.ReadToEnd();
      devices = JsonConvert.DeserializeObject<List<Device>>(json);
    }

    byte[] bin;
    //String.Format(@"{0}\devices.csv", savefilePath)
    using (MemoryStream stream = new MemoryStream())
    using (TextWriter textWriter = new StreamWriter(stream))
    using (CsvWriter csv = new CsvWriter(textWriter))
    {
      csv.Configuration.ShouldQuote = (field, context) => false;

      csv.WriteRecords(devices);
      bin = stream.ToArray();
    }
c# asp.net asp.net-web-api csvhelper
2个回答
0
投票

这与另一个问题CsvHelper not writing anything to memory stream有关。你只需要更改你的using语句,以便在调用StreamWriter之前刷新stream.ToArray();

List<Device> devices;

    using (StreamReader r = new StreamReader(String.Format(@"{0}\deviceList.json", savefilePath)))
    {
      string json = r.ReadToEnd();
      devices = JsonConvert.DeserializeObject<List<Device>>(json);
    }

    byte[] bin;
    //String.Format(@"{0}\devices.csv", savefilePath)
    using (MemoryStream stream = new MemoryStream()) 
    {
       using (TextWriter textWriter = new StreamWriter(stream))
       using (CsvWriter csv = new CsvWriter(textWriter))
       {
         csv.Configuration.ShouldQuote = (field, context) => false;

         csv.WriteRecords(devices);
       }

       bin = stream.ToArray();
    }

0
投票

实际上,经过一番挣扎,发现我错过了这条线。

textWriter.Flush();

如下面的回复所述,我必须刷新textWriter对象才能写入文件。这是工作代码。

  byte[] data;
  using (MemoryStream stream = new MemoryStream())
  using (TextWriter textWriter = new StreamWriter(stream))
  using (CsvWriter csv = new CsvWriter(textWriter))
  {
    csv.Configuration.RegisterClassMap<DeviceMap>();
    csv.Configuration.ShouldQuote = (field, context) => false;

    csv.WriteRecords(values);
    textWriter.Flush();
    data = stream.ToArray();
  }

  return data;
© www.soinside.com 2019 - 2024. All rights reserved.