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();
}
}
我最初的要求是让用户从对象列表中下载一个文件,因为我找到了这个解决方案
但是问题出在这一行
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();
}
}