StreamContent未加载结束

问题描述:

我有(几)的WebAPI行动(S),其装载的QuickFix日志从数据库(通过EF),并使用该私有方法将其返回为CSV:StreamContent未加载结束

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

+1

关闭你的'StreamWriter',然后在内存流上执行seek操作并且不调用flush。 – rene

+0

@rene,谢谢你的回复,但这没有帮助。如果我关闭'作家'然后'stream.Seek'抛出'ObjectDisposedException' – oxfn

你需要你触摸底层流之前刷新你的StreamWriter的内部缓冲区。

最好是告诉你的StreamWriter通过使用另一个contructor来保持流打开。然后,您可以安全地处置您的Streamwriter,使其在您的内存流实例保持打开状态时刷新其缓冲区,并且不会丢弃。

请注意,您需要选择一个与您的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); 
+0

什么是幻数 - 8196?你的意思是8192? :) – oxfn

+0

@oxfn我在看着它,并认为*东西是关闭*,但它还没有计算它是什么......现在修复,谢谢 – rene

+0

谢谢,看起来像它现在正常工作! – oxfn