回到WebForms時代,我可以使用Response.OutputStream.Write()
和Response.Flush()
將文件數據分塊到客戶端 - 因爲我們流式傳輸的文件很大,並且會消耗太多的Web服務器內存。我現在可以如何使用新的MVC類如FileStreamResult
?來自數據流的流文件內容
我確切的情況是:DB在VarBinary
列中包含文件數據(CSV或XLS)。在WebForms實現中,我發送了一個System.Func
到DataAccess層,該層將遍歷IDataReader
並使用System.Func
將內容流式傳輸到客戶端。關鍵是我不希望Web應用程序必須具有任何特定的數據庫知識,包括IDataReader
。
如何使用MVC實現相同的結果?
的函數功能是(我在網絡層定義和發送到數據庫層):
Func<byte[], long, bool> partialUpdateFunc = (data, length) =>
{
if (Response.IsClientConnected)
{
// Write the data to the current output stream.
Response.OutputStream.Write(data, 0, (int) length);
// Flush the data to the HTML output.
Response.Flush();
return true;
}
else
{
return false;
}
};
和DB層,我們從DB SP獲得IDataReader
(使用的ExecuteReader聲明):
using (var reader = conn.ExecuteReader())
{
if (reader.Read())
{
byte[] outByte = new byte[BufferSize];
long startIndex = 0;
// Read bytes into outByte[] and retain the number of bytes returned.
long retval = reader.GetBytes(0, startIndex, outByte, 0, BufferSize);
// Continue while there are bytes beyond the size of the buffer.
bool stillConnected = true;
while (retval == BufferSize)
{
stillConnected = partialUpdateFunc(outByte, retval);
if (!stillConnected)
{
break;
}
// Reposition start index to end of last buffer and fill buffer.
startIndex += BufferSize;
retval = reader.GetBytes(0, startIndex, outByte, 0, BufferSize);
}
// Write the remaining buffer.
if (stillConnected)
{
partialUpdateFunc(outByte, retval);
}
}
// Close the reader and the connection.
reader.Close();
}
對此很好奇...你不希望Web有任何'數據庫引用'...但是,假設你將引用傳遞給響應(在Func中)到DB ... DB層需要參考'Web stuff'?或者因爲數據庫只傳遞一個Func參數,並且沒有公共的'Web參數',所以不需要它? – Terry