StreamContent 没有加载到最后
StreamContent not loaded to the end
我有(几个)WebAPI 操作,它们从数据库(通过 EF)加载 QuickFix 日志,并使用此私有方法将它们 return 作为 CSV:
private HttpResponseMessage BuildCsvResponse<T>(T[] entries, Func<T, string> row, string fileName)
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
var i = entries.Length;
foreach (var entry in entries)
{
i--;
writer.WriteLine(row(entry)); // simply call to overridden ToString() method
}
stream.Seek(0, SeekOrigin.Begin);
stream.Flush();
response.Content = new StreamContent(stream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName,
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
return response;
}
问题是内容永远不会加载到末尾并在离末尾不远的随机符号上剪切。为什么会发生?
可能这很重要 - 所有日志字符串都包含分隔符 0x01
在接触底层流之前,您需要刷新流编写器的内部缓冲区。
最好是使用另一个 contructor 告诉您的 StreamWriter 保持流打开。然后,您可以安全地处置您的 streamwriter,使其刷新其缓冲区,同时您的 memorystream 实例保持打开状态并且不会被处置。
请注意,您需要选择与您的 HTTP 内容响应相匹配的编码。我这里选择的是UTF8,相应修改。
var stream = new MemoryStream();
// notice the true as last parameter, false is the default.
using(var writer = new StreamWriter(stream, Encoding.UTF8, 8192, true))
{
var i = entries.Length;
foreach (var entry in entries)
{
i--;
writer.WriteLine(row(entry)); // simply call to overridden ToString() method
}
}
// your streamwriter has now flushed its buffer and left the stream open
stream.Seek(0, SeekOrigin.Begin);
// calling Flush on the stream was never needed so I removed that.
response.Content = new StreamContent(stream);
我有(几个)WebAPI 操作,它们从数据库(通过 EF)加载 QuickFix 日志,并使用此私有方法将它们 return 作为 CSV:
private HttpResponseMessage BuildCsvResponse<T>(T[] entries, Func<T, string> row, string fileName)
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
var i = entries.Length;
foreach (var entry in entries)
{
i--;
writer.WriteLine(row(entry)); // simply call to overridden ToString() method
}
stream.Seek(0, SeekOrigin.Begin);
stream.Flush();
response.Content = new StreamContent(stream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName,
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
return response;
}
问题是内容永远不会加载到末尾并在离末尾不远的随机符号上剪切。为什么会发生?
可能这很重要 - 所有日志字符串都包含分隔符 0x01
在接触底层流之前,您需要刷新流编写器的内部缓冲区。
最好是使用另一个 contructor 告诉您的 StreamWriter 保持流打开。然后,您可以安全地处置您的 streamwriter,使其刷新其缓冲区,同时您的 memorystream 实例保持打开状态并且不会被处置。
请注意,您需要选择与您的 HTTP 内容响应相匹配的编码。我这里选择的是UTF8,相应修改。
var stream = new MemoryStream();
// notice the true as last parameter, false is the default.
using(var writer = new StreamWriter(stream, Encoding.UTF8, 8192, true))
{
var i = entries.Length;
foreach (var entry in entries)
{
i--;
writer.WriteLine(row(entry)); // simply call to overridden ToString() method
}
}
// your streamwriter has now flushed its buffer and left the stream open
stream.Seek(0, SeekOrigin.Begin);
// calling Flush on the stream was never needed so I removed that.
response.Content = new StreamContent(stream);