asp.net Web API csv запись в поток не работает - PullRequest
0 голосов
/ 10 марта 2019

мое первоначальное требование - разрешить пользователю загружать файл из списка объектов, для которого я нашел это решение https://stackoverflow.com/a/49207997/11178128,

Но проблема в том, что когда дело доходит до этой строки

bin = stream.ToArray();

нет записанных потоков.Таким образом, корзина поставляется как пустой массив.в чем может быть проблема?

также, я делаю свой веб-API доступным через службу Windows.И по какой-то причине System.Web.HttpContext.Current.Response дает мне ноль.Есть идеи, почему это может быть?заранее спасибо.

это код, который у меня есть,

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

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

На самом деле, после небольшого труда, обнаружил, что я пропустил эту строку.

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;
0 голосов
/ 15 марта 2019

Это связано с другим вопросом, CsvHelper ничего не записывает в поток памяти . Вам просто нужно изменить операторы использования так, чтобы 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();
    }
...