asp.net Web API 写入流的 csv 助手不起作用

asp.net Web API csv helper writing to the stream doesn't work

我最初的要求是让用户从对象列表中下载一个文件,因为我找到了这个解决方案

但是问题出在这一行

bin = stream.ToArray();

没有流写入其中。所以 bin 是一个空数组。 可能是什么问题?

此外,我正在通过 windows 服务使我的网站 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();
    }

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

之前刷新 StreamWriter
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();
    }

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

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;
 using (var ms = new MemoryStream())
            {
                using (var writer = new StreamWriter(ms))
                using (var csv = new CsvWriter(writer))
                {
                    csv.WriteRecords(dbresponse);
                } // the closing tag here is important!!It flush the streamwriter
                 ms.ToArray(); // or ms.GetBuffer()
            }

现在 ms.ToArray() 将包含来自 csvHelper

的数据

对于字段变体 - 例如一个列表,它不能使用 writerecords 方法 - 您将需要使用 writefield。我只是在这里提交这个,因为这个微不足道的问题让我 none 太痛苦了。

这是一个异步示例:

var result = await GetListOfString();

        using (var ms = new MemoryStream())
        {
            using (var writer = new StreamWriter(ms))
            using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
            {
                foreach (var value in result)
                {
                    csv.WriteField(value);
                    await csv.NextRecordAsync();
                }
         
                await writer.FlushAsync();
                return ms.ToArray(); 
            } 
        }