2012-05-02 19 views
29

El siguiente código funciona, pero me pregunto si el MemoryStream creado está cerrado correctamente. ¿Cómo se debe hacer esto o lo maneja el FileStreamResult?Con FileStreamResult, ¿cómo se cierra MemoryStream?

public FileStreamResult DownloadBudgetedRoleOpportunities(
    Guid projectGuid, 
    IEnumerable<Guid> guidRequiredRoles) 
{ 
    var rolebroker = new ProjectRoleBudgetBroker(); 
    var memstream = rolebroker.CreateBudgetedRoleOpportunies(
     projectGuid, 
     guidRequiredRoles); 

    var fsr = new FileStreamResult (memstream, "application/csv") 
       { 
       FileDownloadName = "RoleOpportunities.csv" 
       }; 
    // memstream.Close(); throws exception 
    return fsr; 
} 

Respuesta

37

El FileStreamResult lo hará por usted. En caso de duda, compruebe siempre el código, ya que el código nunca miente y, dado que ASP.NET MVC es de código abierto, es aún más fácil ver el código.

Una búsqueda rápida en Google para FileStreamResult.cs le permite verificar que en el método WriteFile la transmisión se eliminó correctamente mediante la instrucción using. (Sin doble sentido)

protected override void WriteFile(HttpResponseBase response) { 
    // grab chunks of data and write to the output stream 
    Stream outputStream = response.OutputStream; 
    using (FileStream) { 
     byte[] buffer = new byte[_bufferSize]; 

     while (true) { 
      int bytesRead = FileStream.Read(buffer, 0, _bufferSize); 
      if (bytesRead == 0) { 
       // no more data 
       break; 
      } 

      outputStream.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
2

Usted tiene acceso al código fuente, por lo que puede comprobar usted mismo ;-)

protected override void WriteFile(HttpResponseBase response) 
{ 
    Stream outputStream = response.OutputStream; 
    using (this.FileStream) 
    { 
    byte[] buffer = new byte[4096]; 
    while (true) 
    { 
     int count = this.FileStream.Read(buffer, 0, 4096); 
     if (count != 0) 
     outputStream.Write(buffer, 0, count); 
     else 
     break; 
    } 
    } 
} 
Cuestiones relacionadas