8

Ich würde gerne HttpResponse.OutputStream zusammen mit ContentResult verwenden, so dass ich von Zeit zu Zeit Flush vermeiden kann, zu viel RAM von .Net zu verwenden.Wie können große Datenmengen von MVC3 ordnungsgemäß übertragen werden, ohne zu viel RAM zu verwenden?

Aber alle Beispiele mit MVC FileStreamResult, EmptyResult, FileResult, ActionResult, ContentResult zeigen Code, der alle Daten in den Speicher bekommt und an einen davon übergibt. Auch ein Beitrag schlägt vor, dass die Rückkehr EmptyResult zusammen mit HttpResponse.OutputStream ist eine schlechte Idee. Wie kann ich das sonst in MVC machen?

Was ist der richtige Weg, um die spülbare Ausgabe von Big Data (html oder binär) vom MVC Server zu organisieren?

Warum gibt EmptyResult oder ContentResult oder FileStreamResult eine schlechte Idee zurück?

+0

Hat jemand Informationen zur Verwendung von Pipe-Streams, die in http://stackoverflow.com/a/2189635/37055 erwähnt werden –

Antwort

5

Sie möchten FileStreamResult verwenden, wenn Sie bereits einen Stream zum Arbeiten hatten. Oft haben Sie möglicherweise nur Zugriff auf die Datei, müssen einen Stream erstellen und diesen dann an den Client ausgeben.

System.IO.Stream iStream = null; 

// Buffer to read 10K bytes in chunk: 
byte[] buffer = new Byte[10000]; 

// Length of the file: 
int length; 

// Total bytes to read: 
long dataToRead; 

// Identify the file to download including its path. 
string filepath = "DownloadFileName"; 

// Identify the file name. 
string filename = System.IO.Path.GetFileName(filepath); 

try 
{ 
    // Open the file. 
    iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 
       System.IO.FileAccess.Read,System.IO.FileShare.Read); 


    // Total bytes to read: 
    dataToRead = iStream.Length; 

    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); 

    // Read the bytes. 
    while (dataToRead > 0) 
    { 
     // Verify that the client is connected. 
     if (Response.IsClientConnected) 
     { 
      // Read the data in buffer. 
      length = iStream.Read(buffer, 0, 10000); 

      // Write the data to the current output stream. 
      Response.OutputStream.Write(buffer, 0, length); 

      // Flush the data to the HTML output. 
      Response.Flush(); 

      buffer= new Byte[10000]; 
      dataToRead = dataToRead - length; 
     } 
     else 
     { 
      //prevent infinite loop if user disconnects 
      dataToRead = -1; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    // Trap the error, if any. 
    Response.Write("Error : " + ex.Message); 
} 
finally 
{ 
    if (iStream != null) 
    { 
     //Close the file. 
     iStream.Close(); 
    } 
    Response.Close(); 
} 

Here ist der Microsoft-Artikel den obigen Code zu erklären.

Verwandte Themen