2017-10-20 65 views
2

我有(幾)的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

回答

2

你需要你觸摸底層流之前刷新你的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